汤锅功能实现 6
This commit is contained in:
1 parent
c342dcc93d
commit
72172ba09c
8 files changed
+679
-568
No files matched your search
+19
-19
@@ -3,7 +3,7 @@
|
||||
================================================================================
|
||||
厨具·右键转换引擎(服务端)
|
||||
================================================================================
|
||||
处理"厨具"(xy_kitchenware) 分类下的右键转换:
|
||||
处理"厨具"(xy_kitchenware) 分类下的右键转换,
|
||||
炉灶(加木条/点燃)、丸子机(放面团/放鱿鱼须/放配料/盘子取成品)、
|
||||
搅拌器(肉/牛奶/蛋/鸡蛋牛奶/奶油/蛋液)、石磨(加黄豆/研磨/玻璃罐取油)、
|
||||
蒸笼(盖盖/掀盖)。
|
||||
@@ -17,7 +17,7 @@
|
||||
所有事件由 FeatureDispatcher 统一监听, 按 blockOwner 路由到本类 handleBlockUse。
|
||||
|
||||
【本类怎么做(自上而下的方法系列)】
|
||||
handleBlockUse ← 入口:分发器转发右键方块事件
|
||||
handleBlockUse ← 入口,分发器转发右键方块事件
|
||||
├─ _handleBeater ← 搅拌器(多分支, 需记录放入的肉类型)
|
||||
├─ _handleStonemill ← 石磨(黄豆/研磨旋转/玻璃罐取油)
|
||||
└─ handleSwitch ← 炉灶/丸子机/蒸笼 的通用开关规则
|
||||
@@ -90,13 +90,13 @@ class ChujuService(BlueFoxServerSystem):
|
||||
self.timerSources.add(src)
|
||||
self.featureBlocks.add(src)
|
||||
if src not in self.startTimerTips:
|
||||
sec = r.get("time", 60)
|
||||
if src == "rtdd:meatballmaker_3":
|
||||
self.startTimerTips[src] = "§a开始烹制…共需计时60秒(半熟30秒+熟30秒); 计时结束变成 章鱼小丸子"
|
||||
self.timingTips[src] = "§e正在烹制中…共需计时60秒(半熟30秒+熟30秒), 计时结束变成 章鱼小丸子"
|
||||
self.startTimerTips[src] = "§a开始烹制(第1级/共2级): 还需60秒(每级30秒), 计时结束变成 章鱼小丸子, 手持盘子出锅"
|
||||
self.timingTips[src] = "§e正在烹制中(第1级/共2级): 还需60秒(每级30秒), 计时结束变成 章鱼小丸子, 手持盘子出锅"
|
||||
else:
|
||||
self.startTimerTips[src] = "§a开始烹制…共需计时%d秒; 计时结束变成 章鱼小丸子" % sec
|
||||
self.timingTips[src] = "§e正在烹制中…共需计时%d秒, 计时结束变成 章鱼小丸子" % sec
|
||||
sec = r.get("time", 60)
|
||||
self.startTimerTips[src] = "§a开始烹制(第2级/共2级): 还需%d秒, 计时结束变成 章鱼小丸子, 手持盘子出锅" % sec
|
||||
self.timingTips[src] = "§e正在烹制中(第2级/共2级): 还需%d秒, 计时结束变成 章鱼小丸子, 手持盘子出锅" % sec
|
||||
|
||||
# ---- 右键冷却表 ----
|
||||
self.cooldown = {}
|
||||
@@ -209,7 +209,7 @@ class ChujuService(BlueFoxServerSystem):
|
||||
else:
|
||||
self._writeOilUses(dim, pos, uses)
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, "§a锅铲蘸了油, 变成带油锅铲; 油罐剩余 %d 次" % uses)
|
||||
playerId, "§a锅铲蘸了油, 变成带油锅铲; 油罐剩余 " + str(uses) + " 次")
|
||||
return True
|
||||
|
||||
def _returnOil(self, playerId, key, dim, pos):
|
||||
@@ -224,7 +224,7 @@ class ChujuService(BlueFoxServerSystem):
|
||||
uses += 1
|
||||
self._writeOilUses(dim, pos, uses)
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, "§a油还回油罐, 变回锅铲; 油罐剩余 %d 次" % uses)
|
||||
playerId, "§a油还回油罐, 变回锅铲; 油罐剩余 " + str(uses) + " 次")
|
||||
return True
|
||||
|
||||
def _oilWok(self, playerId, key, dim, pos):
|
||||
@@ -292,7 +292,7 @@ class ChujuService(BlueFoxServerSystem):
|
||||
started = FeatureDispatcher.startTimerFor(blockName, dim, pos, playerId)
|
||||
if started:
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, self.startTimerTips.get(blockName, "§a开始计时…"))
|
||||
playerId, self.startTimerTips.get(blockName, "§a已启动计时"))
|
||||
else:
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, "§c丸子机需要放在点燃的炉灶上才能开始烹制")
|
||||
@@ -363,7 +363,7 @@ class ChujuService(BlueFoxServerSystem):
|
||||
# ============================================================================
|
||||
|
||||
def _handleBeater(self, blockName, playerId, pos, dim, itemDict, itemName, key):
|
||||
# ---------- 空搅拌器:放入第一份食材 ----------
|
||||
# ---------- 空搅拌器,放入第一份食材 ----------
|
||||
if blockName == "rtdd:beater":
|
||||
if itemName in MEAT_ITEMS:
|
||||
if (itemDict.get("count") or 0) < 2:
|
||||
@@ -501,7 +501,7 @@ class ChujuService(BlueFoxServerSystem):
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, "§a鸡蛋牛奶完成,可加盘子取蛋液")
|
||||
else:
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a搅打中…")
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a搅打中,")
|
||||
return True
|
||||
return False
|
||||
|
||||
@@ -556,7 +556,7 @@ class ChujuService(BlueFoxServerSystem):
|
||||
playerId, "§a研磨完成,可加玻璃罐取油")
|
||||
else:
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, "§a研磨中…(%d/%d)" % (newProg, STONEMILL_GRIND_COUNT))
|
||||
playerId, "§a研磨中,(%d/%d)" % (newProg, STONEMILL_GRIND_COUNT))
|
||||
return True
|
||||
|
||||
# ---- 完成: + 玻璃罐 -> 油罐 ----
|
||||
@@ -655,7 +655,7 @@ class ChujuService(BlueFoxServerSystem):
|
||||
pass
|
||||
|
||||
# ============================================================================
|
||||
# 八、工具方法:获取玩家主手物品
|
||||
# 八、工具方法,获取玩家主手物品
|
||||
# ============================================================================
|
||||
|
||||
def getCarriedItem(self, playerId):
|
||||
@@ -664,7 +664,7 @@ class ChujuService(BlueFoxServerSystem):
|
||||
serverApi.GetMinecraftEnum().ItemPosType.CARRIED, 0, True)
|
||||
|
||||
# ============================================================================
|
||||
# 九、工具方法:给玩家物品
|
||||
# 九、工具方法,给玩家物品
|
||||
# ============================================================================
|
||||
|
||||
def giveItem(self, playerId, itemName, count=1, aux=0):
|
||||
@@ -675,7 +675,7 @@ class ChujuService(BlueFoxServerSystem):
|
||||
pass
|
||||
|
||||
# ============================================================================
|
||||
# 十、工具方法:消耗物品
|
||||
# 十、工具方法,消耗物品
|
||||
# ============================================================================
|
||||
|
||||
def consumeItem(self, playerId, itemDict, amount=1):
|
||||
@@ -696,7 +696,7 @@ class ChujuService(BlueFoxServerSystem):
|
||||
"userData": itemDict.get("userData", {})})
|
||||
|
||||
# ============================================================================
|
||||
# 十一、工具方法:替换方块
|
||||
# 十一、工具方法,替换方块
|
||||
# ============================================================================
|
||||
|
||||
def replaceBlock(self, pos, dim, newBlockName, playerId=None):
|
||||
@@ -712,7 +712,7 @@ class ChujuService(BlueFoxServerSystem):
|
||||
oldBlockHandling=0, dimensionId=dim)
|
||||
|
||||
# ============================================================================
|
||||
# 十二、工具方法:以掉落物形式生成物品
|
||||
# 十二、工具方法,以掉落物形式生成物品
|
||||
# ============================================================================
|
||||
|
||||
def dropItems(self, dim, pos, dropList):
|
||||
@@ -725,7 +725,7 @@ class ChujuService(BlueFoxServerSystem):
|
||||
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
|
||||
|
||||
# ============================================================================
|
||||
# 十三、工具方法:冷却检查
|
||||
# 十三、工具方法,冷却检查
|
||||
# ============================================================================
|
||||
|
||||
def checkCooldown(self, key, cd=0.5):
|
||||
|
||||
+17
-17
@@ -125,20 +125,20 @@ SWITCH_RULES = [
|
||||
{"block": "rtdd:farineblock_1", "item": WATER_BUCKET,
|
||||
"target": "rtdd:farineblock_2", "consume": 1, "give": EMPTY_BUCKET,
|
||||
"tip": "§a面粉加水, 水桶变空桶"},
|
||||
{"block": "rtdd:rawdough_0", "item": None, "target": "rtdd:rawdough_1", "tip": "§a和面中…"},
|
||||
{"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_0", "item": None, "target": "rtdd:rawdough_1", "tip": "§a和面中,"},
|
||||
{"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和面完成, 开始发酵"},
|
||||
{"block": "rtdd:rawdough_4", "item": CLEAVER, "action": "chop_smalldough",
|
||||
"tip": "§a切出了8个小面团"},
|
||||
{"block": "rtdd:dough_0", "item": ROLLINGPIN, "target": "rtdd:dough_1",
|
||||
"consume": 1, "tip": "§a开始擀面(消耗1根擀面杖)"},
|
||||
{"block": "rtdd:dough_1", "item": None, "target": "rtdd:dought_2", "tip": "§a擀面中…"},
|
||||
{"block": "rtdd:dought_2", "item": None, "target": "rtdd:dought_3", "tip": "§a擀面中…"},
|
||||
{"block": "rtdd:dought_3", "item": None, "target": "rtdd:dought_4", "tip": "§a擀面中…"},
|
||||
{"block": "rtdd:dought_4", "item": None, "target": "rtdd:dought_5", "tip": "§a擀面中…"},
|
||||
{"block": "rtdd:dought_5", "item": None, "target": "rtdd:dought_6", "tip": "§a擀面中…"},
|
||||
{"block": "rtdd:dough_1", "item": None, "target": "rtdd:dought_2", "tip": "§a擀面中,"},
|
||||
{"block": "rtdd:dought_2", "item": None, "target": "rtdd:dought_3", "tip": "§a擀面中,"},
|
||||
{"block": "rtdd:dought_3", "item": None, "target": "rtdd:dought_4", "tip": "§a擀面中,"},
|
||||
{"block": "rtdd:dought_4", "item": None, "target": "rtdd:dought_5", "tip": "§a擀面中,"},
|
||||
{"block": "rtdd:dought_5", "item": None, "target": "rtdd:dought_6", "tip": "§a擀面中,"},
|
||||
{"block": "rtdd:dought_6", "item": None, "target": "rtdd:dought_7",
|
||||
"give": ROLLINGPIN, "tip": "§a擀好了, 擀面杖返还"},
|
||||
{"block": "rtdd:dought_7", "item": CLEAVER, "target": "rtdd:dought_8", "tip": "§a面饼切开"},
|
||||
@@ -147,8 +147,8 @@ SWITCH_RULES = [
|
||||
"tip": "§a切出了生面"},
|
||||
{"block": "rtdd:smalldough_0", "item": ROLLINGPIN, "target": "rtdd:smalldough_1",
|
||||
"consume": 1, "tip": "§a开始擀小面团(消耗1根擀面杖)"},
|
||||
{"block": "rtdd:smalldough_1", "item": None, "target": "rtdd:smalldough_2", "tip": "§a擀小面团中…"},
|
||||
{"block": "rtdd:smalldough_2", "item": None, "target": "rtdd:smalldough_3", "tip": "§a擀小面团中…"},
|
||||
{"block": "rtdd:smalldough_1", "item": None, "target": "rtdd:smalldough_2", "tip": "§a擀小面团中,"},
|
||||
{"block": "rtdd:smalldough_2", "item": None, "target": "rtdd:smalldough_3", "tip": "§a擀小面团中,"},
|
||||
{"block": "rtdd:smalldough_3", "item": None, "action": "drop_dumpling_skin",
|
||||
"dropItem": "rtdd:dumplings_0", "give": ROLLINGPIN,
|
||||
"tip": "§a压成饺子皮, 擀面杖返还"},
|
||||
@@ -174,7 +174,7 @@ SWITCH_RULES = [
|
||||
"tip": "§a包子皮加了肉馅"},
|
||||
{"block": "rtdd:baozipi", "item": BEEF_FILLING, "target": "rtdd:roubao_1",
|
||||
"tip": "§a包子皮加了肉馅"},
|
||||
{"block": "rtdd:roubao_1", "item": None, "target": "rtdd:roubao_2", "tip": "§a塑形中…"},
|
||||
{"block": "rtdd:roubao_1", "item": None, "target": "rtdd:roubao_2", "tip": "§a塑形中,"},
|
||||
{"block": "rtdd:roubao_2", "item": None, "action": "drop_result",
|
||||
"dropItem": "rtdd:roubaozi_3", "tip": "§a塑形成生肉包子"},
|
||||
{"block": "rtdd:baozilong_2", "item": None, "action": "take_steamer",
|
||||
@@ -208,9 +208,9 @@ SWITCH_RULES = [
|
||||
{"block": "rtdd:cookeddought_2", "item": POTATO, "target": "rtdd:cookeddought_3",
|
||||
"consume": 1, "tip": "§a加入土豆"},
|
||||
{"block": "rtdd:cookeddought_3", "item": None, "target": "rtdd:cookeddought_4",
|
||||
"tip": "§a卷制中…"},
|
||||
"tip": "§a卷制中,"},
|
||||
{"block": "rtdd:cookeddought_4", "item": None, "target": "rtdd:cookeddought_5",
|
||||
"tip": "§a卷制中…"},
|
||||
"tip": "§a卷制中,"},
|
||||
{"block": "rtdd:cookeddought_5", "item": None, "target": "rtdd:cookeddought_6",
|
||||
"tip": "§a煎饼卷牛肉完成"},
|
||||
{"block": "rtdd:cookeddought_1", "item": COOKED_COD, "target": "rtdd:cookedcoddought_2",
|
||||
@@ -218,9 +218,9 @@ SWITCH_RULES = [
|
||||
{"block": "rtdd:cookedcoddought_2", "item": POTATO, "target": "rtdd:cookedcoddought_3",
|
||||
"consume": 1, "tip": "§a加入土豆"},
|
||||
{"block": "rtdd:cookedcoddought_3", "item": None, "target": "rtdd:cookedcoddought_4",
|
||||
"tip": "§a卷制中…"},
|
||||
"tip": "§a卷制中,"},
|
||||
{"block": "rtdd:cookedcoddought_4", "item": None, "target": "rtdd:cookedcoddought_5",
|
||||
"tip": "§a卷制中…"},
|
||||
"tip": "§a卷制中,"},
|
||||
{"block": "rtdd:cookedcoddought_5", "item": None, "target": "rtdd:cookedcoddought_6",
|
||||
"tip": "§a煎饼卷鳕鱼完成"},
|
||||
|
||||
@@ -310,9 +310,9 @@ SWITCH_RULES = [
|
||||
# ============================================================================
|
||||
KNEAD_COUNTERS = {
|
||||
"rtdd:farineblock_2": {"times": 2, "target": "rtdd:farineblock_3",
|
||||
"tip": "§a揉面中…(%d/2)", "doneTip": "§a揉好了, 变成面粉块"},
|
||||
"tip": "§a揉面中,(%d/2)", "doneTip": "§a揉好了, 变成面粉块"},
|
||||
"rtdd:farineblock_3": {"times": 3, "target": "rtdd:rawdough_0",
|
||||
"tip": "§a和面中…(%d/3)", "doneTip": "§a和好面了, 变成生面团"},
|
||||
"tip": "§a和面中,(%d/3)", "doneTip": "§a和好面了, 变成生面团"},
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
|
||||
+18
-19
@@ -3,7 +3,7 @@
|
||||
================================================================================
|
||||
面食.甜食·右键转换引擎(服务端)
|
||||
================================================================================
|
||||
处理"面食.甜食"(xy_mianshi) 分类下的右键转换:
|
||||
处理"面食.甜食"(xy_mianshi) 分类下的右键转换,
|
||||
面粉·面团(和面/擀面/切分)、饺子、包子、馍、煎饼卷、竹筒饭、
|
||||
面包堆叠/递减、面团胚料循环、甜点蛋糕(脱模/加料/切分)。
|
||||
|
||||
@@ -13,11 +13,11 @@
|
||||
(多服务 fallback) 路由到本类 handleBlockUse / handleItemUseOn。
|
||||
|
||||
【本类怎么做】
|
||||
handleBlockUse ← 入口:分发器转发右键方块事件
|
||||
handleBlockUse ← 入口,分发器转发右键方块事件
|
||||
├─ _handleKnead ← 揉面/和面 连点计数(空手)
|
||||
├─ _handleAction ← 特殊动作(蒸笼取出/切小面团/切生面/蛋糕脱模)
|
||||
└─ handleSwitch ← 通用转换(加料/擀面/卷制/堆叠/递减/切分)
|
||||
handleItemUseOn ← 入口:生面饼右键烤炉烙制 / 面粉(加鸡蛋)右键木碗做面糊
|
||||
handleItemUseOn ← 入口,生面饼右键烤炉烙制 / 面粉(加鸡蛋)右键木碗做面糊
|
||||
(通用工具) getCarriedItem / consumeItem / giveItem / dropItem / replaceBlock /
|
||||
clearBlock / checkCooldown
|
||||
================================================================================
|
||||
@@ -107,8 +107,8 @@ class MianshiService(BlueFoxServerSystem):
|
||||
if src not in self.startTimerTips:
|
||||
sec = r.get("time", 60)
|
||||
tgt = NAME_MAP.get(r["target"], r["target"])
|
||||
self.startTimerTips[src] = "§a开始蒸制…共需计时%d秒; 计时结束变成 %s" % (sec, tgt)
|
||||
self.timingTips[src] = "§e正在蒸制中…共需计时%d秒, 计时结束变成 %s" % (sec, tgt)
|
||||
self.startTimerTips[src] = "§a开始蒸制: 还需%d秒, 计时结束变成 %s" % (sec, tgt)
|
||||
self.timingTips[src] = "§e正在蒸制中: 还需%d秒, 计时结束变成 %s" % (sec, tgt)
|
||||
|
||||
# ---- 结果方块/物品 -> "下一步"可读提示(供转换/入笼提示追加) ----
|
||||
# 例子: 饺子皮 -> "加入 猪肉馅、青菜碎"; 可颂面胚 -> "放在烤炉上等计时(60秒)结束变成 可颂"
|
||||
@@ -195,9 +195,8 @@ 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):
|
||||
tip = "§a开始烤制…共需计时60秒; 计时结束变成 " + \
|
||||
self.timerTargetName.get(blockName, "成品")
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(playerId, tip)
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, "§a已启动计时(共60秒)")
|
||||
return True
|
||||
|
||||
# ---- 烤制成品取走: 空手右键成品(下方是烤炉) -> 成品掉落物, 烤炉不动 ----
|
||||
@@ -295,7 +294,7 @@ class MianshiService(BlueFoxServerSystem):
|
||||
tip = rule["tip"]
|
||||
nxt = self._nextStepTip(rule.get("replace") or rule.get("above"))
|
||||
if nxt:
|
||||
tip += ";" + nxt
|
||||
tip += "," + nxt
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(playerId, tip)
|
||||
return True
|
||||
|
||||
@@ -313,7 +312,7 @@ class MianshiService(BlueFoxServerSystem):
|
||||
started = FeatureDispatcher.startTimerFor(blockName, dim, pos, playerId)
|
||||
if started:
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, self.startTimerTips.get(blockName, "§a开始蒸制…"))
|
||||
playerId, self.startTimerTips.get(blockName, "§a已启动计时"))
|
||||
else:
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, "§c蒸笼需要放在点燃的炉灶上才能开始蒸制")
|
||||
@@ -412,11 +411,11 @@ class MianshiService(BlueFoxServerSystem):
|
||||
tip = recipe["tip"]
|
||||
nxt = self._nextStepTip(recipe.get("target") or recipe.get("dropItem"))
|
||||
if nxt:
|
||||
tip += ";" + nxt
|
||||
tip += "," + nxt
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(playerId, tip)
|
||||
|
||||
# ============================================================================
|
||||
# 五、工具方法:判断正下方是否指定方块(烤炉/点燃炉灶)
|
||||
# 五、工具方法,判断正下方是否指定方块(烤炉/点燃炉灶)
|
||||
# ============================================================================
|
||||
|
||||
def _belowIs(self, dim, pos, blockName):
|
||||
@@ -431,7 +430,7 @@ class MianshiService(BlueFoxServerSystem):
|
||||
return NAME_MAP.get(blockName, blockName)
|
||||
|
||||
def _nextStepTip(self, key):
|
||||
"""按结果方块/物品生成"你可以…"的可读下一步提示; 无则返回空串
|
||||
"""按结果方块/物品生成"你可以,"的可读下一步提示; 无则返回空串
|
||||
例: 饺子皮 -> "你可以加入 猪肉馅、青菜碎"
|
||||
可颂面胚 -> "你可以放在烤炉上等计时(60秒)结束变成 可颂"
|
||||
"""
|
||||
@@ -456,7 +455,7 @@ class MianshiService(BlueFoxServerSystem):
|
||||
return "你可以" + " 或 ".join(parts)
|
||||
|
||||
# ============================================================================
|
||||
# 六、工具方法:获取玩家主手物品
|
||||
# 六、工具方法,获取玩家主手物品
|
||||
# ============================================================================
|
||||
|
||||
def getCarriedItem(self, playerId):
|
||||
@@ -465,7 +464,7 @@ class MianshiService(BlueFoxServerSystem):
|
||||
serverApi.GetMinecraftEnum().ItemPosType.CARRIED, 0, True)
|
||||
|
||||
# ============================================================================
|
||||
# 七、工具方法:给玩家物品
|
||||
# 七、工具方法,给玩家物品
|
||||
# ============================================================================
|
||||
|
||||
def giveItem(self, playerId, itemName, count=1, aux=0):
|
||||
@@ -476,7 +475,7 @@ class MianshiService(BlueFoxServerSystem):
|
||||
pass
|
||||
|
||||
# ============================================================================
|
||||
# 八、工具方法:消耗物品
|
||||
# 八、工具方法,消耗物品
|
||||
# ============================================================================
|
||||
|
||||
def consumeItem(self, playerId, itemDict, amount=1):
|
||||
@@ -497,7 +496,7 @@ class MianshiService(BlueFoxServerSystem):
|
||||
"userData": itemDict.get("userData", {})})
|
||||
|
||||
# ============================================================================
|
||||
# 九、工具方法:以掉落物形式生成物品
|
||||
# 九、工具方法,以掉落物形式生成物品
|
||||
# ============================================================================
|
||||
|
||||
def dropItem(self, dim, pos, itemName, count=1, aux=0):
|
||||
@@ -508,7 +507,7 @@ class MianshiService(BlueFoxServerSystem):
|
||||
pass
|
||||
|
||||
# ============================================================================
|
||||
# 十、工具方法:替换方块 / 清空方块(保留 aux, 兼容定向变体)
|
||||
# 十、工具方法,替换方块 / 清空方块(保留 aux, 兼容定向变体)
|
||||
# ============================================================================
|
||||
|
||||
def replaceBlock(self, pos, dim, newBlockName, playerId=None):
|
||||
@@ -529,7 +528,7 @@ class MianshiService(BlueFoxServerSystem):
|
||||
oldBlockHandling=0, dimensionId=dim)
|
||||
|
||||
# ============================================================================
|
||||
# 十一、工具方法:冷却检查
|
||||
# 十一、工具方法,冷却检查
|
||||
# ============================================================================
|
||||
|
||||
def checkCooldown(self, key, cd=0.4):
|
||||
|
||||
+23
-23
@@ -277,67 +277,67 @@ SWITCH_RULES = [
|
||||
# ---------------- 四、加肉/鱼/豆腐 -> 汤羹(生), 开始计时 ----------------
|
||||
{"block": CARROT_SOUP, "item": BEEF, "target": CARROT_BEEF_SOUP,
|
||||
"consume": 2, "startTimer": CARROT_BEEF_SOUP,
|
||||
"tip": "§a胡萝卜汤加生牛肉x2, 开始熬制(共90秒, 3级×30秒); 等计时结束变成 胡萝卜牛肉汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a胡萝卜汤加生牛肉x2, 开始熬制(共90秒, 3级,30秒); 等计时结束变成 胡萝卜牛肉汤(熟), 手持木碗出锅"},
|
||||
{"block": CARROT_SOUP, "item": MUTTON, "target": LAMB_SOUP_WITH_TURNIPS,
|
||||
"consume": 2, "startTimer": LAMB_SOUP_WITH_TURNIPS,
|
||||
"tip": "§a胡萝卜汤加羊肉x2, 开始熬制(共180秒, 3级×60秒); 等计时结束变成 胡萝卜羊肉汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a胡萝卜汤加羊肉x2, 开始熬制(共180秒, 3级,60秒); 等计时结束变成 胡萝卜羊肉汤(熟), 手持木碗出锅"},
|
||||
{"block": CARROT_SOUP, "item": PORKRIB, "target": CARROT_RIBS,
|
||||
"consume": 2, "startTimer": CARROT_RIBS,
|
||||
"tip": "§a胡萝卜汤加猪肋排x2, 开始熬制(共180秒, 3级×60秒); 等计时结束变成 胡萝卜排骨汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a胡萝卜汤加猪肋排x2, 开始熬制(共180秒, 3级,60秒); 等计时结束变成 胡萝卜排骨汤(熟), 手持木碗出锅"},
|
||||
{"block": VEGETABLE_SOUP, "item": MUTTON, "target": VEGETABLE_BEEF_SOUP,
|
||||
"consume": 2, "startTimer": VEGETABLE_BEEF_SOUP,
|
||||
"tip": "§a蔬菜汤加羊肉x2, 开始熬制(共180秒, 3级×60秒); 等计时结束变成 清汤羊肉(熟), 手持木碗出锅"},
|
||||
"tip": "§a蔬菜汤加羊肉x2, 开始熬制(共180秒, 3级,60秒); 等计时结束变成 清汤羊肉(熟), 手持木碗出锅"},
|
||||
{"block": VEGETABLE_SOUP, "item": BEEF, "target": VEGETABLE_LAMB_SOUP,
|
||||
"consume": 2, "startTimer": VEGETABLE_LAMB_SOUP,
|
||||
"tip": "§a蔬菜汤加生牛肉x2, 开始熬制(共180秒, 3级×60秒); 等计时结束变成 蔬菜牛肉汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a蔬菜汤加生牛肉x2, 开始熬制(共180秒, 3级,60秒); 等计时结束变成 蔬菜牛肉汤(熟), 手持木碗出锅"},
|
||||
{"block": VEGETABLE_SOUP, "item": CRUSHED_MEAT, "target": VEGETABLE_LEAN_BROTH,
|
||||
"consume": 5, "startTimer": VEGETABLE_LEAN_BROTH,
|
||||
"tip": "§a蔬菜汤加碎肉x5, 开始熬制(共180秒, 3级×60秒); 等计时结束变成 蔬菜瘦肉汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a蔬菜汤加碎肉x5, 开始熬制(共180秒, 3级,60秒); 等计时结束变成 蔬菜瘦肉汤(熟), 手持木碗出锅"},
|
||||
{"block": VEGETABLE_SOUP, "item": CARROT_POTATO_SOUP, "target": VEGETABLE_SSTEW,
|
||||
"consume": 1, "drop": POT_EMPTY, "startTimer": VEGETABLE_SSTEW,
|
||||
"tip": "§a蔬菜汤加胡萝卜土豆汤, 变成 蔬菜乱炖(生), 掉落一个汤锅(空); 开始熬制(共180秒, 3级×60秒), 等计时结束变熟, 手持木碗出锅"},
|
||||
"tip": "§a蔬菜汤加胡萝卜土豆汤, 变成 蔬菜乱炖(生), 掉落一个汤锅(空); 开始熬制(共180秒, 3级,60秒), 等计时结束变熟, 手持木碗出锅"},
|
||||
{"block": CARROT_POTATO_SOUP, "item": VEGETABLE, "target": VEGETABLE_SSTEW,
|
||||
"consume": 3, "startTimer": VEGETABLE_SSTEW,
|
||||
"tip": "§a胡萝卜土豆汤加青菜碎x3, 变成 蔬菜乱炖(生); 开始熬制(共180秒, 3级×60秒), 等计时结束变熟, 手持木碗出锅"},
|
||||
"tip": "§a胡萝卜土豆汤加青菜碎x3, 变成 蔬菜乱炖(生); 开始熬制(共180秒, 3级,60秒), 等计时结束变熟, 手持木碗出锅"},
|
||||
{"block": CARROT_POTATO_SOUP, "item": COW_RIBS, "target": BEEF_BONE_BROTH,
|
||||
"consume": 2, "startTimer": BEEF_BONE_BROTH,
|
||||
"tip": "§a胡萝卜土豆汤加牛肋x2, 开始熬制(共180秒, 3级×60秒); 等计时结束变成 胡萝卜土豆牛骨汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a胡萝卜土豆汤加牛肋x2, 开始熬制(共180秒, 3级,60秒); 等计时结束变成 胡萝卜土豆牛骨汤(熟), 手持木碗出锅"},
|
||||
{"block": CARROT_POTATO_SOUP, "item": MUTTON, "target": LAMB_STEW,
|
||||
"consume": 2, "startTimer": LAMB_STEW,
|
||||
"tip": "§a胡萝卜土豆汤加羊肉x2, 开始熬制(共180秒, 3级×60秒); 等计时结束变成 土豆胡萝卜炖羊肉(熟), 手持木碗出锅"},
|
||||
"tip": "§a胡萝卜土豆汤加羊肉x2, 开始熬制(共180秒, 3级,60秒); 等计时结束变成 土豆胡萝卜炖羊肉(熟), 手持木碗出锅"},
|
||||
{"block": CARROT_POTATO_SOUP, "item": SHEEP_RACKS, "target": VEGETABLE_POTATOES_LAMBSTEAK,
|
||||
"consume": 2, "startTimer": VEGETABLE_POTATOES_LAMBSTEAK,
|
||||
"tip": "§a胡萝卜土豆汤加羊小排x2, 开始熬制(共180秒, 3级×60秒); 等计时结束变成 胡萝卜土豆羊排汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a胡萝卜土豆汤加羊小排x2, 开始熬制(共180秒, 3级,60秒); 等计时结束变成 胡萝卜土豆羊排汤(熟), 手持木碗出锅"},
|
||||
{"block": CARROT_SOUP, "item": COD, "target": CARROT_COD_SOUP,
|
||||
"consume": 1, "startTimer": CARROT_COD_SOUP,
|
||||
"tip": "§a胡萝卜汤加鳕鱼, 开始熬制(共180秒, 3级×60秒); 等计时结束变成 胡萝卜鳕鱼汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a胡萝卜汤加鳕鱼, 开始熬制(共180秒, 3级,60秒); 等计时结束变成 胡萝卜鳕鱼汤(熟), 手持木碗出锅"},
|
||||
{"block": CARROT_SOUP, "item": SALMON, "target": CARROT_FISH_SOUP,
|
||||
"consume": 1, "startTimer": CARROT_FISH_SOUP,
|
||||
"tip": "§a胡萝卜汤加鲑鱼, 开始熬制(共180秒, 3级×60秒); 等计时结束变成 胡萝卜鲑鱼汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a胡萝卜汤加鲑鱼, 开始熬制(共180秒, 3级,60秒); 等计时结束变成 胡萝卜鲑鱼汤(熟), 手持木碗出锅"},
|
||||
{"block": COD_SOUP, "item": EGG, "target": EGG_COD_SOUP,
|
||||
"consume": 3, "startTimer": EGG_COD_SOUP,
|
||||
"tip": "§a鳕鱼汤加鸡蛋x3, 开始熬制(共180秒, 3级×60秒); 等计时结束变成 蛋花鳕鱼汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a鳕鱼汤加鸡蛋x3, 开始熬制(共180秒, 3级,60秒); 等计时结束变成 蛋花鳕鱼汤(熟), 手持木碗出锅"},
|
||||
{"block": EGG_SOUP, "item": COD, "target": EGG_COD_SOUP,
|
||||
"consume": 1, "startTimer": EGG_COD_SOUP,
|
||||
"tip": "§a蛋花汤加鳕鱼, 开始熬制(共180秒, 3级×60秒); 等计时结束变成 蛋花鳕鱼汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a蛋花汤加鳕鱼, 开始熬制(共180秒, 3级,60秒); 等计时结束变成 蛋花鳕鱼汤(熟), 手持木碗出锅"},
|
||||
{"block": EGG_SOUP, "item": CRUSHED_MEAT, "target": NORI_EGG_SOUP,
|
||||
"consume": 5, "startTimer": NORI_EGG_SOUP,
|
||||
"tip": "§a蛋花汤加碎肉x5, 开始熬制(共120秒, 4级×30秒); 等计时结束变成 瘦肉蛋花汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a蛋花汤加碎肉x5, 开始熬制(共120秒, 4级,30秒); 等计时结束变成 瘦肉蛋花汤(熟), 手持木碗出锅"},
|
||||
{"block": VEGETABLE_LEAN_BROTH, "item": EGG, "target": NORI_EGG_SOUP,
|
||||
"consume": 3, "startTimer": NORI_EGG_SOUP,
|
||||
"tip": "§a蔬菜瘦肉汤加鸡蛋x3, 开始熬制(共120秒, 4级×30秒); 等计时结束变成 瘦肉蛋花汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a蔬菜瘦肉汤加鸡蛋x3, 开始熬制(共120秒, 4级,30秒); 等计时结束变成 瘦肉蛋花汤(熟), 手持木碗出锅"},
|
||||
{"block": TOFU_SOUP, "item": SALMON, "target": TOFU_FISH_SOUP_RAW,
|
||||
"consume": 1, "startTimer": TOFU_FISH_SOUP_RAW,
|
||||
"tip": "§a豆腐汤加鲑鱼, 开始熬制(共180秒, 3级×60秒); 等计时结束变成 豆腐鲑鱼汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a豆腐汤加鲑鱼, 开始熬制(共180秒, 3级,60秒); 等计时结束变成 豆腐鲑鱼汤(熟), 手持木碗出锅"},
|
||||
{"block": SALMON_SOUP, "item": BEANCURD, "target": TOFU_FISH_SOUP_RAW,
|
||||
"consume": 4, "startTimer": TOFU_FISH_SOUP_RAW,
|
||||
"tip": "§a鲑鱼汤加豆腐x4, 开始熬制(共180秒, 3级×60秒); 等计时结束变成 豆腐鲑鱼汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a鲑鱼汤加豆腐x4, 开始熬制(共180秒, 3级,60秒); 等计时结束变成 豆腐鲑鱼汤(熟), 手持木碗出锅"},
|
||||
{"block": MUSHROOM_SOUP, "item": CHICKEN, "target": CHICKEN_STEW_MUSHROOMS,
|
||||
"consume": 1, "startTimer": CHICKEN_STEW_MUSHROOMS,
|
||||
"tip": "§a蘑菇汤加生鸡肉, 开始熬制(共270秒, 3级×90秒); 等计时结束变成 蘑菇炖鸡(熟), 手持木碗出锅"},
|
||||
"tip": "§a蘑菇汤加生鸡肉, 开始熬制(共270秒, 3级,90秒); 等计时结束变成 蘑菇炖鸡(熟), 手持木碗出锅"},
|
||||
{"block": VEGETABLE_SOUP, "item": SASHIMI, "target": VEGETABLE_FISH_SOUP_0,
|
||||
"consume": 10, "startTimer": VEGETABLE_FISH_SOUP_0,
|
||||
"tip": "§a蔬菜汤加生鱼片x10, 开始熬制(共180秒, 3级×60秒); 等计时结束变成 蔬菜鱼片汤(熟), 手持木碗出锅"},
|
||||
"tip": "§a蔬菜汤加生鱼片x10, 开始熬制(共180秒, 3级,60秒); 等计时结束变成 蔬菜鱼片汤(熟), 手持木碗出锅"},
|
||||
|
||||
# ---------------- 五、单独菜谱 ----------------
|
||||
# 菜谱29 猪蹄汤
|
||||
@@ -345,7 +345,7 @@ SWITCH_RULES = [
|
||||
"consume": 2, "tip": "§a放入猪蹄x2, 变成 猪蹄汤(生); 继续拿土豆块x3右键 加土豆"},
|
||||
{"block": RAW_PIG_FOOD_SOUP_0, "item": POTATO_WEDGES, "target": RAW_PIG_FOOD_SOUP_2,
|
||||
"consume": 3, "startTimer": RAW_PIG_FOOD_SOUP_2,
|
||||
"tip": "§a猪蹄汤加土豆块x3, 开始熬制(共90秒, 3级×30秒); 等计时结束变成 猪蹄汤(全熟), 手持木碗出锅"},
|
||||
"tip": "§a猪蹄汤加土豆块x3, 开始熬制(共90秒, 3级,30秒); 等计时结束变成 猪蹄汤(全熟), 手持木碗出锅"},
|
||||
# 菜谱30 羊肉泡馍汤
|
||||
{"block": POT_WATER, "item": MO, "target": ROUJIAMO_SOUP_0,
|
||||
"consume": 1, "startTimer": ROUJIAMO_SOUP_0,
|
||||
@@ -357,7 +357,7 @@ SWITCH_RULES = [
|
||||
# 菜谱32 饺子汤
|
||||
{"block": POT_WATER, "item": DUMPLINGS, "target": DUMPLINGS_SOUP_0,
|
||||
"consume": 1, "startTimer": DUMPLINGS_SOUP_0,
|
||||
"tip": "§a放入生饺子, 开始熬制(共120秒, 2级×60秒); 等计时结束变成 饺子汤(熟), 手持木碗盛出 饺子_碗装"},
|
||||
"tip": "§a放入生饺子, 开始熬制(共120秒, 2级,60秒); 等计时结束变成 饺子汤(熟), 手持木碗盛出 饺子_碗装"},
|
||||
# 菜谱35 生米锅
|
||||
{"block": POT_WATER, "item": BROWN_RICE, "target": RAW_RICE_POT,
|
||||
"consume": 64, "startTimer": RAW_RICE_POT,
|
||||
|
||||
+72
-28
@@ -36,7 +36,7 @@ from ....BlueFoxTools.ToolsConfig import LevelId
|
||||
blockEntityDataComp = comp.CreateBlockEntityData(LevelId)
|
||||
|
||||
# ---- 只导入汤锅自己的数据库 ----
|
||||
from ..TangguoData import SWITCH_RULES, ITEM_USE_ON_RULES, TIMER_RULES
|
||||
from ..TangguoData import SWITCH_RULES, ITEM_USE_ON_RULES, TIMER_RULES, BOWL, PLATE
|
||||
|
||||
# ---- 统一分发器 ----
|
||||
from ...service.FeatureDispatcher import FeatureDispatcher
|
||||
@@ -83,6 +83,32 @@ class TangguoService(BlueFoxServerSystem):
|
||||
cur = nxt
|
||||
self._timerTotal[src] = (total, stages)
|
||||
|
||||
# 级数信息: source -> (当前第几级, 总级数) 用于提示"第X级/共Y级"
|
||||
self._timerStages = {}
|
||||
nextMap, prevMap = {}, {}
|
||||
for r in TIMER_RULES:
|
||||
if r.get("target"):
|
||||
nextMap[r["source"]] = r["target"]
|
||||
prevMap.setdefault(r["target"], r["source"])
|
||||
for src in self._timerBySrc:
|
||||
if src not in nextMap:
|
||||
self._timerStages[src] = (1, 1)
|
||||
continue
|
||||
head = src
|
||||
while head in prevMap and prevMap[head] in self._timerBySrc:
|
||||
head = prevMap[head]
|
||||
totalLevel, cur, seen = 0, head, set()
|
||||
while cur in self._timerBySrc and cur not in seen:
|
||||
seen.add(cur)
|
||||
totalLevel += 1
|
||||
cur = nextMap[cur]
|
||||
cur, level, seen2 = head, 1, set()
|
||||
while cur != src and cur in nextMap and cur not in seen2:
|
||||
seen2.add(cur)
|
||||
level += 1
|
||||
cur = nextMap[cur]
|
||||
self._timerStages[src] = (level, totalLevel)
|
||||
|
||||
# 终点方块 -> 成品名(从 take_out 规则 tip 的"盛出 XX"提取, 用于计时提示)
|
||||
self._finalNames = {}
|
||||
for r in SWITCH_RULES:
|
||||
@@ -93,29 +119,47 @@ class TangguoService(BlueFoxServerSystem):
|
||||
if nm:
|
||||
self._finalNames[r["block"]] = nm
|
||||
|
||||
# 终点方块 -> 出锅动作(从 take_out 规则的 item 推断: 木碗/盘子/空手)
|
||||
self._finalInfo = {}
|
||||
for r in SWITCH_RULES:
|
||||
if r.get("action") == "take_out":
|
||||
it = r.get("item")
|
||||
if it == BOWL:
|
||||
self._finalInfo[r["block"]] = "手持木碗出锅"
|
||||
elif it == PLATE:
|
||||
self._finalInfo[r["block"]] = "手持盘子出锅"
|
||||
elif it is None:
|
||||
self._finalInfo[r["block"]] = "空手取出"
|
||||
|
||||
self.timerSources = set()
|
||||
self.startTimerTips = {} # 空手右键启动计时 -> 提示(含总共多少秒)
|
||||
self.timingTips = {} # 空手右键"已在计时中" -> 提示(同样含总共多少秒)
|
||||
for src, r in self._timerBySrc.items():
|
||||
self.timerSources.add(src)
|
||||
self.featureBlocks.add(src) # 登记右键路由, 空手右键才分发到这里
|
||||
total, stages = self._timerTotal[src]
|
||||
total, stages = self._timerTotal[src] # total = 从当前级到终点剩余秒数
|
||||
curLv, totLv = self._timerStages.get(src, (1, 1))
|
||||
lvTip = "(第%d级/共%d级)" % (curLv, totLv) if totLv > 1 else ""
|
||||
if len(stages) == 1:
|
||||
stage = ""
|
||||
perTip = ""
|
||||
elif len(set(stages)) == 1:
|
||||
stage = "(%d级×%d秒)" % (len(stages), stages[0])
|
||||
perTip = "每级%d秒" % stages[0]
|
||||
else:
|
||||
stage = "(%d级: %s)" % (len(stages), "→".join("%d秒" % s for s in stages))
|
||||
perTip = "先%d秒,再%s" % (stages[0], ",".join("%d秒" % s for s in stages[1:]))
|
||||
perStr = (", " + perTip) if perTip else ""
|
||||
if r.get("randomTargets"):
|
||||
tip = "§a开始煮饭…共需计时%d秒%s; 计时结束变成 熟米饭(形态随机)" % (total, stage)
|
||||
t2 = "§e正在煮饭中…共需计时%d秒%s, 计时结束变成 熟米饭(形态随机)" % (total, stage)
|
||||
tip = "§a开始煮饭%s: 还需%d秒%s, 计时结束变成 熟米饭(形态随机)" % (lvTip, total, perStr)
|
||||
t2 = "§e正在煮饭中%s: 还需%d秒%s, 计时结束变成 熟米饭(形态随机)" % (lvTip, total, perStr)
|
||||
else:
|
||||
tip = "§a开始熬制…共需计时%d秒%s" % (total, stage)
|
||||
t2 = "§e正在熬制中…共需计时%d秒%s" % (total, stage)
|
||||
end = self._timerTerminalName(src)
|
||||
if end:
|
||||
tip += "; 计时结束变成 %s" % end
|
||||
t2 += ", 计时结束变成 %s" % end
|
||||
endBlock = self._timerTerminal(src)
|
||||
endName = self._finalNames.get(endBlock, "") if endBlock else ""
|
||||
act = self._finalInfo.get(endBlock) if endBlock else None
|
||||
actStr = (", " + act) if act else ""
|
||||
base = "还需%d秒%s" % (total, perStr)
|
||||
if endName:
|
||||
base += ", 计时结束变成 %s%s" % (endName, actStr)
|
||||
tip = "§a开始熬制%s: %s" % (lvTip, base)
|
||||
t2 = "§e正在熬制中%s: %s" % (lvTip, base)
|
||||
self.startTimerTips[src] = tip
|
||||
self.timingTips[src] = t2
|
||||
|
||||
@@ -170,29 +214,29 @@ class TangguoService(BlueFoxServerSystem):
|
||||
try:
|
||||
data = blockEntityDataComp.GetBlockEntityData(dim, pos)
|
||||
if data and data["rtdd_tid"] == blockName:
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, self.timingTips.get(blockName, "§e已经在计时中"))
|
||||
msg = self.timingTips.get(blockName) or "§e正在熬制中"
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(playerId, msg)
|
||||
return
|
||||
except Exception:
|
||||
pass
|
||||
started = FeatureDispatcher.startTimerFor(blockName, dim, pos, playerId)
|
||||
if started:
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, self.startTimerTips.get(blockName, "§a开始计时…"))
|
||||
msg = self.startTimerTips.get(blockName) or "§a已启动计时"
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(playerId, msg)
|
||||
else:
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, "§c汤锅需要放在点燃的炉灶上才能开始计时")
|
||||
playerId, "§c需要放在点燃的炉灶上")
|
||||
|
||||
def _timerTerminalName(self, src):
|
||||
"""沿计时链走到终点方块, 返回成品名(未取到则返回空串)"""
|
||||
def _timerTerminal(self, src):
|
||||
"""沿计时链走到终点方块(返回方块id); randomTargets 返回 None"""
|
||||
cur, seen = src, set()
|
||||
while cur in self._timerBySrc and cur not in seen:
|
||||
seen.add(cur)
|
||||
r = self._timerBySrc[cur]
|
||||
if r.get("randomTargets"):
|
||||
return ""
|
||||
return None
|
||||
cur = r["target"]
|
||||
return self._finalNames.get(cur, "")
|
||||
return cur
|
||||
|
||||
def handleItemUseOn(self, args):
|
||||
"""由 FeatureDispatcher 转发的"手持物品右键方块表面"入口(锅态汤面)。
|
||||
@@ -266,7 +310,7 @@ class TangguoService(BlueFoxServerSystem):
|
||||
return "rtdd:stewedsoup"
|
||||
|
||||
# ============================================================================
|
||||
# 三、工具方法:获取玩家主手物品
|
||||
# 三、工具方法,获取玩家主手物品
|
||||
# ============================================================================
|
||||
|
||||
def getCarriedItem(self, playerId):
|
||||
@@ -275,7 +319,7 @@ class TangguoService(BlueFoxServerSystem):
|
||||
serverApi.GetMinecraftEnum().ItemPosType.CARRIED, 0, True)
|
||||
|
||||
# ============================================================================
|
||||
# 四、工具方法:给玩家物品
|
||||
# 四、工具方法,给玩家物品
|
||||
# ============================================================================
|
||||
|
||||
def giveItem(self, playerId, itemName, count=1, aux=0):
|
||||
@@ -286,7 +330,7 @@ class TangguoService(BlueFoxServerSystem):
|
||||
pass
|
||||
|
||||
# ============================================================================
|
||||
# 五、工具方法:消耗物品
|
||||
# 五、工具方法,消耗物品
|
||||
# ============================================================================
|
||||
|
||||
def consumeItem(self, playerId, itemDict, amount=1):
|
||||
@@ -307,7 +351,7 @@ class TangguoService(BlueFoxServerSystem):
|
||||
"userData": itemDict.get("userData", {})})
|
||||
|
||||
# ============================================================================
|
||||
# 六、工具方法:以掉落物形式生成物品
|
||||
# 六、工具方法,以掉落物形式生成物品
|
||||
# ============================================================================
|
||||
|
||||
def dropItem(self, dim, pos, itemName, count=1, aux=0):
|
||||
@@ -318,7 +362,7 @@ class TangguoService(BlueFoxServerSystem):
|
||||
pass
|
||||
|
||||
# ============================================================================
|
||||
# 七、工具方法:替换方块 / 清空方块(清空时 aux 强制 0, 兼容定向变体)
|
||||
# 七、工具方法,替换方块 / 清空方块(清空时 aux 强制 0, 兼容定向变体)
|
||||
# ============================================================================
|
||||
|
||||
def replaceBlock(self, pos, dim, newBlockName, playerId=None):
|
||||
@@ -339,7 +383,7 @@ class TangguoService(BlueFoxServerSystem):
|
||||
oldBlockHandling=0, dimensionId=dim)
|
||||
|
||||
# ============================================================================
|
||||
# 八、工具方法:冷却检查
|
||||
# 八、工具方法,冷却检查
|
||||
# ============================================================================
|
||||
|
||||
def checkCooldown(self, key, cd=0.4):
|
||||
|
||||
@@ -84,19 +84,19 @@ SWITCH_RULES = [
|
||||
{"block": OILPOT_1, "item": BREADED_CHICKEN, "target": CHICKEN_0,
|
||||
"consume": 1, "startTimer": CHICKEN_0,
|
||||
"needBelow": LIT_STOVE, "belowTip": "§c油锅需要放在点燃的炉灶上",
|
||||
"tip": "§a放入裹粉鸡块, 开始炸制(共90秒: 先60秒半熟, 再30秒熟); 计时结束变成 炸鸡块(熟)"},
|
||||
"tip": "§a放入裹粉鸡块,开始炸制共90秒,先60秒半熟,再30秒熟,计时结束变成 炸鸡块(熟)"},
|
||||
{"block": OILPOT_1, "item": BREADED_PORK, "target": PORK_0,
|
||||
"consume": 1, "startTimer": PORK_0,
|
||||
"needBelow": LIT_STOVE, "belowTip": "§c油锅需要放在点燃的炉灶上",
|
||||
"tip": "§a放入裹粉猪肉, 开始炸制(共90秒: 先60秒半熟, 再30秒熟); 计时结束变成 炸猪排(熟)"},
|
||||
"tip": "§a放入裹粉猪肉,开始炸制共90秒,先60秒半熟,再30秒熟,计时结束变成 炸猪排(熟)"},
|
||||
{"block": OILPOT_1, "item": BREADED_FRIES, "target": FRIES_0,
|
||||
"consume": 3, "startTimer": FRIES_0,
|
||||
"needBelow": LIT_STOVE, "belowTip": "§c油锅需要放在点燃的炉灶上",
|
||||
"tip": "§a放入裹粉薯条x3, 开始炸制(共90秒: 先60秒半熟, 再30秒熟); 计时结束变成 炸薯条(熟)"},
|
||||
"tip": "§a放入裹粉薯条x3,开始炸制共90秒,先60秒半熟,再30秒熟,计时结束变成 炸薯条(熟)"},
|
||||
{"block": OILPOT_1, "item": BREADED_FISH, "target": FISH_0,
|
||||
"consume": 1, "startTimer": FISH_0,
|
||||
"needBelow": LIT_STOVE, "belowTip": "§c油锅需要放在点燃的炉灶上",
|
||||
"tip": "§a放入裹粉鱼, 开始炸制(共90秒: 先60秒半熟, 再30秒熟); 计时结束变成 炸鱼块(熟)"},
|
||||
"tip": "§a放入裹粉鱼,开始炸制共90秒,先60秒半熟,再30秒熟,计时结束变成 炸鱼块(熟)"},
|
||||
{"block": OILPOT_1, "item": BREADED_TEMPURA, "target": TEMPURA_1,
|
||||
"consume": 4, "startTimer": TEMPURA_1,
|
||||
"needBelow": LIT_STOVE, "belowTip": "§c油锅需要放在点燃的炉灶上",
|
||||
|
||||
+60
-21
@@ -75,6 +75,31 @@ class YouguoService(BlueFoxServerSystem):
|
||||
cur = nxt
|
||||
self._timerTotal[src] = (total, stages)
|
||||
|
||||
# 级数信息: source -> (当前第几级, 总级数) 用于提示"第X级/共Y级"
|
||||
self._timerStages = {}
|
||||
nextMap, prevMap = {}, {}
|
||||
for r in TIMER_RULES:
|
||||
nextMap[r["source"]] = r["target"]
|
||||
prevMap.setdefault(r["target"], r["source"])
|
||||
for src in self._timerBySrc:
|
||||
if src not in nextMap:
|
||||
self._timerStages[src] = (1, 1)
|
||||
continue
|
||||
head = src
|
||||
while head in prevMap and prevMap[head] in self._timerBySrc:
|
||||
head = prevMap[head]
|
||||
totalLevel, cur, seen = 0, head, set()
|
||||
while cur in self._timerBySrc and cur not in seen:
|
||||
seen.add(cur)
|
||||
totalLevel += 1
|
||||
cur = nextMap[cur]
|
||||
cur, level, seen2 = head, 1, set()
|
||||
while cur != src and cur in nextMap and cur not in seen2:
|
||||
seen2.add(cur)
|
||||
level += 1
|
||||
cur = nextMap[cur]
|
||||
self._timerStages[src] = (level, totalLevel)
|
||||
|
||||
# 终点方块 -> 成品名(从出锅规则 tip 的"取出 XX"提取, 用于计时提示)
|
||||
self._finalNames = {}
|
||||
for r in SWITCH_RULES:
|
||||
@@ -85,23 +110,37 @@ class YouguoService(BlueFoxServerSystem):
|
||||
if nm:
|
||||
self._finalNames[r["block"]] = nm
|
||||
|
||||
# 终点方块 -> 出锅动作(出锅规则 item 为盘子)
|
||||
self._finalInfo = {}
|
||||
for r in SWITCH_RULES:
|
||||
if r.get("action") == "take_out":
|
||||
self._finalInfo[r["block"]] = "手持盘子出锅"
|
||||
|
||||
self.timerSources = set()
|
||||
self.startTimerTips = {} # 空手右键启动计时 -> 提示(含总共多少秒)
|
||||
self.timingTips = {} # 空手右键"已在计时中" -> 提示(同样含总共多少秒)
|
||||
for src, r in self._timerBySrc.items():
|
||||
self.timerSources.add(src)
|
||||
self.featureBlocks.add(src)
|
||||
total, stages = self._timerTotal[src]
|
||||
if len(stages) == 1:
|
||||
stage = ""
|
||||
total, stages = self._timerTotal[src] # total = 从当前级到终点剩余秒数
|
||||
curLv, totLv = self._timerStages.get(src, (1, 1))
|
||||
lvTip = "(第%d级/共%d级)" % (curLv, totLv) if totLv > 1 else ""
|
||||
if len(stages) <= 1:
|
||||
perTip = ""
|
||||
elif len(set(stages)) == 1:
|
||||
perTip = "每级%d秒" % stages[0]
|
||||
else:
|
||||
stage = "(%d级: %s)" % (len(stages), "→".join("%d秒" % s for s in stages))
|
||||
tip = "§a开始炸制…共需计时%d秒%s" % (total, stage)
|
||||
t2 = "§e正在炸制中…共需计时%d秒%s" % (total, stage)
|
||||
end = self._oilTerminalName(src)
|
||||
if end:
|
||||
tip += "; 计时结束变成 %s" % end
|
||||
t2 += ", 计时结束变成 %s" % end
|
||||
perTip = "先%d秒,再%s" % (stages[0], ",".join("%d秒" % s for s in stages[1:]))
|
||||
perStr = (", " + perTip) if perTip else ""
|
||||
endBlock = self._oilTerminal(src)
|
||||
endName = self._finalNames.get(endBlock, "") if endBlock else ""
|
||||
act = self._finalInfo.get(endBlock) if endBlock else None
|
||||
actStr = (", " + act) if act else ""
|
||||
base = "还需%d秒%s" % (total, perStr)
|
||||
if endName:
|
||||
base += ", 计时结束变成 %s%s" % (endName, actStr)
|
||||
tip = "§a开始炸制%s: %s" % (lvTip, base)
|
||||
t2 = "§e正在炸制中%s: %s" % (lvTip, base)
|
||||
self.startTimerTips[src] = tip
|
||||
self.timingTips[src] = t2
|
||||
|
||||
@@ -163,18 +202,18 @@ class YouguoService(BlueFoxServerSystem):
|
||||
started = FeatureDispatcher.startTimerFor(blockName, dim, pos, playerId)
|
||||
if started:
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, self.startTimerTips.get(blockName, "§a开始计时…"))
|
||||
playerId, self.startTimerTips.get(blockName, "§a已启动计时"))
|
||||
else:
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, "§c油锅需要放在点燃的炉灶上才能开始计时")
|
||||
|
||||
def _oilTerminalName(self, src):
|
||||
"""沿计时链走到终点方块, 返回成品名(未取到则返回空串)"""
|
||||
def _oilTerminal(self, src):
|
||||
"""沿计时链走到终点方块(返回方块id)"""
|
||||
cur, seen = src, set()
|
||||
while cur in self._timerBySrc and cur not in seen:
|
||||
seen.add(cur)
|
||||
cur = self._timerBySrc[cur]["target"]
|
||||
return self._finalNames.get(cur, "")
|
||||
return cur
|
||||
|
||||
# ============================================================================
|
||||
# 二、通用转换执行
|
||||
@@ -219,7 +258,7 @@ class YouguoService(BlueFoxServerSystem):
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(playerId, recipe["tip"])
|
||||
|
||||
# ============================================================================
|
||||
# 三、工具方法:判断正下方是否指定方块(点燃炉灶)
|
||||
# 三、工具方法,判断正下方是否指定方块(点燃炉灶)
|
||||
# ============================================================================
|
||||
|
||||
def _belowIs(self, dim, pos, blockName):
|
||||
@@ -230,7 +269,7 @@ class YouguoService(BlueFoxServerSystem):
|
||||
return False
|
||||
|
||||
# ============================================================================
|
||||
# 四、工具方法:获取玩家主手物品
|
||||
# 四、工具方法,获取玩家主手物品
|
||||
# ============================================================================
|
||||
|
||||
def getCarriedItem(self, playerId):
|
||||
@@ -239,7 +278,7 @@ class YouguoService(BlueFoxServerSystem):
|
||||
serverApi.GetMinecraftEnum().ItemPosType.CARRIED, 0, True)
|
||||
|
||||
# ============================================================================
|
||||
# 五、工具方法:给玩家物品
|
||||
# 五、工具方法,给玩家物品
|
||||
# ============================================================================
|
||||
|
||||
def giveItem(self, playerId, itemName, count=1, aux=0):
|
||||
@@ -250,7 +289,7 @@ class YouguoService(BlueFoxServerSystem):
|
||||
pass
|
||||
|
||||
# ============================================================================
|
||||
# 六、工具方法:消耗物品
|
||||
# 六、工具方法,消耗物品
|
||||
# ============================================================================
|
||||
|
||||
def consumeItem(self, playerId, itemDict, amount=1):
|
||||
@@ -271,7 +310,7 @@ class YouguoService(BlueFoxServerSystem):
|
||||
"userData": itemDict.get("userData", {})})
|
||||
|
||||
# ============================================================================
|
||||
# 七、工具方法:以掉落物形式生成物品
|
||||
# 七、工具方法,以掉落物形式生成物品
|
||||
# ============================================================================
|
||||
|
||||
def dropItem(self, dim, pos, itemName, count=1, aux=0):
|
||||
@@ -282,7 +321,7 @@ class YouguoService(BlueFoxServerSystem):
|
||||
pass
|
||||
|
||||
# ============================================================================
|
||||
# 八、工具方法:替换方块 / 清空方块(清空时 aux 强制 0, 兼容定向变体)
|
||||
# 八、工具方法,替换方块 / 清空方块(清空时 aux 强制 0, 兼容定向变体)
|
||||
# ============================================================================
|
||||
|
||||
def replaceBlock(self, pos, dim, newBlockName, playerId=None):
|
||||
@@ -303,7 +342,7 @@ class YouguoService(BlueFoxServerSystem):
|
||||
oldBlockHandling=0, dimensionId=dim)
|
||||
|
||||
# ============================================================================
|
||||
# 九、工具方法:冷却检查
|
||||
# 九、工具方法,冷却检查
|
||||
# ============================================================================
|
||||
|
||||
def checkCooldown(self, key, cd=0.4):
|
||||
|
||||
+466
-437
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user