汤锅功能实现 1

This commit is contained in:
wenhe committed 2026-09-14 16:03:51 +08:00
1 parent d41f1eebac
commit 30ac368690
71 files changed
+2323 -333

No files matched your search

@@ -22,6 +22,8 @@ from xiangyemod.mianshi.service.MianshiService import MianshiService
from xiangyemod.mianshi.service.MianshiTimerService import MianshiTimerService
from xiangyemod.youguo.service.YouguoService import YouguoService
from xiangyemod.youguo.service.YouguoTimerService import YouguoTimerService
from xiangyemod.tangguo.service.TangguoService import TangguoService
from xiangyemod.tangguo.service.TangguoTimerService import TangguoTimerService
if not serverApi.IsInServer():
pass
@@ -0,0 +1,654 @@
# -*- coding: utf-8 -*-
"""
================================================================================
汤锅(xy_tangguo)转化规则数据
================================================================================
统一管理"汤锅"分类下的转化规则常量。只被
TangguoService / TangguoTimerService 读取, FeatureDispatcher 通过
方块名路由到对应服务。
【实现范围(对应 汤锅转化关系.txt)】
一、汤锅基础 : 汤锅(空)<->(加水)、盖/掀锅盖
二、汤底/成品汤: 汤锅(加水)+食材(右键) -> 汤底; 汤底+肉/鱼/豆腐(右键) -> 汤羹(生)
三、计时熬制 : 汤羹(生)->(四分熟)->(八分熟)->(熟), 下方须是点燃的炉灶(stove_2)
四、出锅 : 熟汤羹+木碗(右键) -> 掉落碗装成品, 锅变回 汤锅(空)
五、米饭/蛋/豆腐: 生米锅/煮蛋/煮豆腐 计时 + 取出
六、汤面分组 : 手持汤锅成品菜 右键 熟面条(方块) -> 汤面
【计时(见 TangguoTimerService)】
所有汤羹/生米锅/煮蛋/煮豆腐 计时都判定【正下方】是 点燃的炉灶(stove_2),
计时数据在汤羹方块本身; 炉灶移走/熄灭则暂停, 回来继续
【不实现】: 各碗装成品/汤面 右键吃 (吃的操作后续由总食用功能实现)
================================================================================
"""
# ============================================================================
# 一、方块/物品(常量)
# ============================================================================
POT_EMPTY = "rtdd:stewedsoup" # 汤锅(空)
POT_WATER = "rtdd:stewedsoupwater" # 汤锅(加水)
POT_LID = "rtdd:coverthepot" # 汤锅(盖锅)
LIT_STOVE = "rtdd:stove_2" # 点燃的炉灶(厨具)
BOWL = "rtdd:bowlasoup" # 木碗(厨具)
CLEAVER = "rtdd:cleaver" # 菜刀(厨具)
WATER_BUCKET = "minecraft:water_bucket" # 水桶(原版)
EMPTY_BUCKET = "minecraft:bucket" # 空桶(原版)
# ---- 食材(乡野食材/原版) ----
CRUSHED_CARROTS = "rtdd:crushed_carrots" # 胡萝卜碎
VEGETABLE = "rtdd:vegetable" # 青菜碎
EGG = "minecraft:egg" # 鸡蛋(原版)
POTATO_WEDGES = "rtdd:potato_wedges" # 土豆块/土豆碎
RED_MUSHROOM = "minecraft:red_mushroom" # 红蘑菇(原版)
BROWN_MUSHROOM = "minecraft:brown_mushroom" # 棕蘑菇(原版)
COD = "minecraft:cod" # 鳕鱼(原版)
SALMON = "minecraft:salmon" # 鲑鱼(原版)
BEEF = "minecraft:beef" # 生牛肉(原版)
MUTTON = "minecraft:mutton" # 生羊肉(原版)
CHICKEN = "minecraft:chicken" # 生鸡肉(原版)
PORKRIB = "rtdd:porkrib" # 猪肋排
COW_RIBS = "rtdd:costillavacaes" # 牛肋
SHEEP_RACKS = "rtdd:sheepracks" # 羊小排
CRUSHED_MEAT = "rtdd:crushedmeat" # 碎肉
BEANCURD = "rtdd:beancurd" # 豆腐
HAM = "rtdd:ham" # 猪蹄
MO = "rtdd:roujiamo_0" # 馍(面食.甜食)
NOODLES = "rtdd:noodles" # 生面(面食.甜食)
DUMPLINGS = "rtdd:dumplings_4" # 生饺子(面食.甜食)
SASHIMI = "rtdd:sashimi" # 生鱼片
BROWN_RICE = "rtdd:brownrice" # 大米(乡野食材)
EGG_PILE = "rtdd:egg_pile" # 鸡蛋堆(乡野食材)
SOYMILK = "rtdd:fruitjuice_7" # 豆浆(乡野饮料)
SCALLIONS = "rtdd:crushed_scallions" # 葱花碎
# ============================================================================
# 二、汤底方块(不可计时, 供继续加料/组合)
# ============================================================================
CARROT_SOUP = "rtdd:carrotsoup" # 胡萝卜汤
VEGETABLE_SOUP = "rtdd:vegetablesoup" # 蔬菜汤
EGG_SOUP = "rtdd:eggsoup" # 蛋花汤
POTATO_SOUP = "rtdd:potatosoup" # 土豆汤
CARROT_POTATO_SOUP = "rtdd:carrotandpotatosoup" # 胡萝卜土豆汤
RED_MUSHROOM_SOUP = "rtdd:red_mushroomsoup" # 红蘑菇汤
BROWN_MUSHROOM_SOUP = "rtdd:brownmushroomsoup" # 棕蘑菇汤
MUSHROOM_SOUP = "rtdd:mushroomsoup" # 蘑菇汤
COD_SOUP = "rtdd:codsoup" # 鳕鱼汤
SALMON_SOUP = "rtdd:salmonsoup" # 鲑鱼汤
POTATO_EGG_SOUP = "rtdd:potatoeggsoup" # 土豆蛋花汤
TOFU_SOUP = "rtdd:tufusoup" # 豆腐汤
# ============================================================================
# 三、汤羹计时链(生 -> 四分熟 -> 八分熟 -> 熟)
# ============================================================================
CARROT_BEEF_SOUP = "rtdd:carrotbeefsoup" # 胡萝卜牛肉汤
CARROT_BEEF_SOUP_1 = "rtdd:carrotbeefsoup_1"
CARROT_BEEF_SOUP_2 = "rtdd:carrotbeefsoup_2"
CARROT_BEEF_SOUP_3 = "rtdd:carrotbeefsoup_3"
LAMB_SOUP_WITH_TURNIPS = "rtdd:lambsoupwithturnips" # 胡萝卜羊肉汤
LAMB_SOUP_WITH_TURNIPS_1 = "rtdd:lambsoupwithturnips_1"
LAMB_SOUP_WITH_TURNIPS_2 = "rtdd:lambsoupwithturnips_2"
LAMB_SOUP_WITH_TURNIPS_3 = "rtdd:lambsoupwithturnips_3"
CARROT_RIBS = "rtdd:carrotribs" # 胡萝卜排骨汤
CARROT_RIBS_1 = "rtdd:carrotribs_1"
CARROT_RIBS_2 = "rtdd:carrotribs_2"
CARROT_RIBS_3 = "rtdd:carrotribs_3"
VEGETABLE_BEEF_SOUP = "rtdd:vegetablebeefsoup" # 清汤羊肉
VEGETABLE_BEEF_SOUP_1 = "rtdd:vegetablebeefsoup_1"
VEGETABLE_BEEF_SOUP_2 = "rtdd:vegetablebeefsoup_2"
VEGETABLE_BEEF_SOUP_3 = "rtdd:vegetablebeefsoup_3"
VEGETABLE_LAMB_SOUP = "rtdd:vegetablelambsoup" # 蔬菜牛肉汤
VEGETABLE_LAMB_SOUP_1 = "rtdd:vegetablelambsoup_1"
VEGETABLE_LAMB_SOUP_2 = "rtdd:vegetablelambsoup_2"
VEGETABLE_LAMB_SOUP_3 = "rtdd:vegetablelambsoup_3"
VEGETABLE_LEAN_BROTH = "rtdd:vegetableleanbroth" # 蔬菜瘦肉汤
VEGETABLE_LEAN_BROTH_1 = "rtdd:vegetableleanbroth_1"
VEGETABLE_LEAN_BROTH_2 = "rtdd:vegetableleanbroth_2"
VEGETABLE_LEAN_BROTH_3 = "rtdd:vegetableleanbroth_3"
VEGETABLE_SSTEW = "rtdd:vegetablesstew" # 蔬菜乱炖
VEGETABLE_SSTEW_1 = "rtdd:vegetablesstew_1"
VEGETABLE_SSTEW_2 = "rtdd:vegetablesstew_2"
VEGETABLE_SSTEW_3 = "rtdd:vegetablesstew_3"
BEEF_BONE_BROTH = "rtdd:beefbonebroth" # 胡萝卜土豆牛骨汤
BEEF_BONE_BROTH_1 = "rtdd:beefbonebroth_1"
BEEF_BONE_BROTH_2 = "rtdd:beefbonebroth_2"
BEEF_BONE_BROTH_3 = "rtdd:beefbonebroth_3"
LAMB_STEW = "rtdd:lambstew" # 土豆胡萝卜炖羊肉
LAMB_STEW_1 = "rtdd:lambstew_1"
LAMB_STEW_2 = "rtdd:lambstew_2"
LAMB_STEW_3 = "rtdd:lambstew_3"
VEGETABLE_POTATOES_LAMBSTEAK = "rtdd:vegetablepotatoesandlambsteaksoup" # 胡萝卜土豆羊排汤(生)
LAMB_CHOP_SOUP_1 = "rtdd:lambchopsoup_1" # 胡萝卜土豆羊排汤(三分熟)
LAMB_CHOP_SOUP_2 = "rtdd:lambchopsoup_2" # (七分熟)
LAMB_CHOP_SOUP_3 = "rtdd:lambchopsoup_3" # (熟)
CARROT_COD_SOUP = "rtdd:carrotcodsoup" # 胡萝卜鳕鱼汤
CARROT_COD_SOUP_1 = "rtdd:carrotcodsoup_1"
CARROT_COD_SOUP_2 = "rtdd:carrotcodsoup_2"
CARROT_COD_SOUP_3 = "rtdd:carrotcodsoup_3"
CARROT_FISH_SOUP = "rtdd:carrotfishsoup" # 胡萝卜鲑鱼汤
CARROT_FISH_SOUP_1 = "rtdd:carrotfishsoup_1"
CARROT_FISH_SOUP_2 = "rtdd:carrotfishsoup_2"
CARROT_FISH_SOUP_3 = "rtdd:carrotfishsoup_3"
EGG_COD_SOUP = "rtdd:eggcodsoup" # 蛋花鳕鱼汤
EGG_COD_SOUP_1 = "rtdd:eggcodsoup_1"
EGG_COD_SOUP_2 = "rtdd:eggcodsoup_2"
EGG_COD_SOUP_3 = "rtdd:eggcodsoup_3"
NORI_EGG_SOUP = "rtdd:norieggsoup" # 瘦肉蛋花汤(生)
NORI_EGG_SOUP_0 = "rtdd:norieggsoup_0" # (三分熟)
NORI_EGG_SOUP_1 = "rtdd:norieggsoup_1" # (七分熟)
NORI_EGG_SOUP_2 = "rtdd:norieggsoup_2" # (全熟)
NORI_EGG_SOUP_3 = "rtdd:norieggsoup_3" # (熟)
TOFU_FISH_SOUP_RAW = "rtdd:tufusoupb" # 豆腐鲑鱼汤(生)
TOFU_FISH_SOUP_1 = "rtdd:tufufishsoup_1" # (四分熟)
TOFU_FISH_SOUP_2 = "rtdd:tufufishsoup_2" # (八分熟)
TOFU_FISH_SOUP_3 = "rtdd:tufufishsoup_3" # (熟)
CHICKEN_STEW_MUSHROOMS = "rtdd:chickenstewwithmushrooms" # 蘑菇炖鸡
CHICKEN_STEW_MUSHROOMS_1 = "rtdd:chickenstewwithmushrooms_1"
CHICKEN_STEW_MUSHROOMS_2 = "rtdd:chickenstewwithmushrooms_2"
CHICKEN_STEW_MUSHROOMS_3 = "rtdd:chickenstewwithmushrooms_3"
RAW_PIG_FOOD_SOUP_0 = "rtdd:rawpigfoodsoup_0" # 汤锅_66(猪蹄汤_生)
RAW_PIG_FOOD_SOUP_2 = "rtdd:rawpigfoodsoup_2" # 汤锅_67(猪蹄汤_加土豆)
RAW_PIG_FOOD_SOUP_3 = "rtdd:rawpigfoodsoup_3" # 汤锅_68(三分熟)
RAW_PIG_FOOD_SOUP_4 = "rtdd:rawpigfoodsoup_4" # 汤锅_69(七分熟)
RAW_PIG_FOOD_SOUP_5 = "rtdd:rawpigfoodsoup_5" # 汤锅_70(全熟)
ROUJIAMO_SOUP_0 = "rtdd:roujiamosoup_0" # 羊肉泡馍汤(生)
ROUJIAMO_SOUP_1 = "rtdd:roujiamosoup_1" # (熟)
RAW_NOODLE_SOUP = "rtdd:rawnoodlesoup" # 生面汤(生)
COOKED_NOODLE_SOUP = "rtdd:cookednoodlessoup" # 熟面汤(熟)
DUMPLINGS_SOUP_0 = "rtdd:dumplingssoup_0" # 饺子汤(生)
DUMPLINGS_SOUP_1 = "rtdd:dumplingssoup_1" # (五分熟)
DUMPLINGS_SOUP_2 = "rtdd:dumplingssoup_2" # (熟)
VEGETABLE_FISH_SOUP_0 = "rtdd:vegetablefishsoup_0" # 蔬菜鱼片汤(生)
VEGETABLE_FISH_SOUP_1 = "rtdd:vegetablefishsoup_1"
VEGETABLE_FISH_SOUP_2 = "rtdd:vegetablefishsoup_2"
VEGETABLE_FISH_SOUP_3 = "rtdd:vegetablefishsoup_3"
RAW_RICE_POT = "rtdd:rawricepot" # 生米锅
RICE_POT_1 = "rtdd:ricepot_1" # 熟米饭_形态1
RICE_POT_2 = "rtdd:ricepot_2" # 熟米饭_形态2
RICE_POT_3 = "rtdd:ricepot_3" # 熟米饭_形态3
RAW_EGG_SOUP = "rtdd:raweggsoup" # 煮鸡蛋(生)
COOKED_EGG_SOUP = "rtdd:cookedeggsoup" # 煮鸡蛋(熟)
BEANCURD_SOUP_0 = "rtdd:beancurdsoup_0" # 煮豆腐(生)
BEANCURD_SOUP_1 = "rtdd:beancurdsoup_1" # 煮豆腐(熟)
# ============================================================================
# 四、碗装成品(出锅掉落物, 归 tangguo_finished, 均为【吃】)
# ============================================================================
BOWL_CARROT_BEEF = "rtdd:bowlacarrotbeefsoup" # 胡萝卜牛肉汤
BOWL_LAMB_TURNIP = "rtdd:brownlambsoupwithturnipssoup" # 胡萝卜羊肉汤
BOWL_CARROT_RIBS = "rtdd:bowlacarrotribs" # 胡萝卜排骨汤
BOWL_VEGETABLE_BEEF = "rtdd:bowlavegetablebeefsoup" # 清汤羊肉
BOWL_VEGETABLE_LAMB = "rtdd:bowlavegetablelambsoup" # 蔬菜牛肉汤
BOWL_VEGETABLE_LEAN = "rtdd:bowlavegetableleanbroth" # 蔬菜瘦肉汤
BOWL_VEGETABLE_SSTEW = "rtdd:bowlavegetablesstew" # 蔬菜乱炖
BOWL_BEEF_BONE = "rtdd:bowlabeefbonebroth" # 胡萝卜土豆牛骨汤
BOWL_LAMB_STEW = "rtdd:bowlalambstew" # 土豆胡萝卜炖羊肉
BOWL_LAMB_CHOP = "rtdd:bowla_lambchopsoup" # 胡萝卜土豆羊排汤
BOWL_CARROT_COD = "rtdd:bowlacarrotcodsoup" # 胡萝卜鳕鱼汤
BOWL_CARROT_FISH = "rtdd:browncarrotfishsoupsoup" # 胡萝卜鲑鱼汤
BOWL_EGG_COD = "rtdd:bowlaeggcodsoup" # 蛋花鳕鱼汤
BOWL_NORI_EGG = "rtdd:brown_norieggsoup" # 瘦肉蛋花汤
BOWL_TOFU_FISH = "rtdd:bowlatufufish" # 豆腐鲑鱼汤
BOWL_MUSHROOM_CHICKEN = "rtdd:bowlofmushroomsoup" # 蘑菇炖鸡
BOWL_PIG_FOOT = "rtdd:brownpigfootsoup" # 猪蹄汤
BOWL_ROUJIAMO = "rtdd:bowla_roujiamo" # 羊肉泡馍汤
BOWL_NOODLE = "rtdd:noodle_soup" # 熟面条
BOWL_DUMPLINGS = "rtdd:dumplingssoup" # 饺子_碗装
BOWL_VEGETABLE_FISH = "rtdd:brownvegetablefishsoup" # 蔬菜鱼片汤
BOWL_RICE_1 = "rtdd:bowlofrice" # 米饭_1(熟米饭_形态1)
BOWL_RICE_2 = "rtdd:bowlofrice_2" # 米饭_2(形态2)
BOWL_RICE_3 = "rtdd:bowlofrice_3" # 米饭_3(形态3)
# ============================================================================
# 五、汤面方块(food_02_rice_noodle 分组)
# ============================================================================
NOODLESOUP_1 = "rtdd:noodlesoup_1" # 猪排蔬菜面
NOODLESOUP_2 = "rtdd:noodlesoup_2" # 羊排蔬菜面
NOODLESOUP_3 = "rtdd:noodlesoup_3" # 牛骨面
NOODLESOUP_4 = "rtdd:noodlesoup_4" # 小鸡炖蘑菇面
ASSORTED_RAMEN = "rtdd:assortedramen" # 胡萝卜蔬菜面
BRAISED_NOODLES = "rtdd:braisednoodles" # 胡萝卜蔬菜牛肉面
MUSHROOM_NOODLES = "rtdd:mushroomnoodles" # 香菇面
YUSHENG_RAMEN = "rtdd:yushengramen" # 蔬菜鱼片面
VEGETABLE_NOODLES = "rtdd:vegetable_noodles" # 蔬菜面
NOODLES_1 = "rtdd:noodles_1" # 蛋花面
NOODLES_2 = "rtdd:noodles_2" # 蛋花面(加葱花)
EGG_NOODLES = "rtdd:egg_noodles" # 鸡蛋面
TONKOTSU_RAMEN = "rtdd:tonkotsu_ramen" # 猪排蔬菜面加水煮蛋(由 猪排蔬菜面+水煮蛋)
# ============================================================================
# 六、右键规则 (方块, 手持物品) -> 规则
# item=None 表示空手右键
# target=替换方块; consume=消耗手持; give=给背包;
# drop=额外掉落(掉落物形式); dropItem=出锅/取出掉落物; count=掉落数量;
# action=take_out(出锅/取出: 变回汤锅(空)+掉落); startTimer=转换后启动计时
# ============================================================================
SWITCH_RULES = [
# ---------------- 一、汤锅基础 ----------------
{"block": POT_EMPTY, "item": WATER_BUCKET, "target": POT_WATER,
"consume": 1, "give": EMPTY_BUCKET,
"tip": "§a倒入水, 汤锅变(加水); 水桶变回空桶"},
{"block": POT_WATER, "item": EMPTY_BUCKET, "target": POT_EMPTY,
"consume": 1, "drop": WATER_BUCKET,
"tip": "§a倒掉水, 汤锅变回(空), 掉落一个水桶"},
{"block": POT_WATER, "item": None, "target": POT_LID,
"tip": "§a盖上锅盖, 汤锅变(盖锅); 空手右键可再掀开"},
{"block": POT_LID, "item": None, "target": POT_WATER,
"tip": "§a掀开锅盖, 汤锅变回(加水)"},
# ---------------- 二、汤底(汤锅(加水)+食材 -> 汤底) ----------------
{"block": POT_WATER, "item": CRUSHED_CARROTS, "target": CARROT_SOUP,
"consume": 4, "tip": "§a放入胡萝卜碎x4, 变成 胡萝卜汤; 可继续加肉/鱼 或 组合汤"},
{"block": POT_WATER, "item": VEGETABLE, "target": VEGETABLE_SOUP,
"consume": 4, "tip": "§a放入青菜碎x4, 变成 蔬菜汤; 可继续加肉/鱼 或 组合汤"},
{"block": POT_WATER, "item": EGG, "target": EGG_SOUP,
"consume": 3, "tip": "§a放入鸡蛋x3, 变成 蛋花汤; 可继续加肉/鱼 或 组合汤"},
{"block": POT_WATER, "item": POTATO_WEDGES, "target": POTATO_SOUP,
"consume": 4, "tip": "§a放入土豆块x4, 变成 土豆汤; 可继续加肉/鱼 或 组合汤"},
{"block": POT_WATER, "item": RED_MUSHROOM, "target": RED_MUSHROOM_SOUP,
"consume": 5, "tip": "§a放入红蘑菇x5, 变成 红蘑菇汤; 可继续加食材"},
{"block": POT_WATER, "item": BROWN_MUSHROOM, "target": BROWN_MUSHROOM_SOUP,
"consume": 5, "tip": "§a放入棕蘑菇x5, 变成 棕蘑菇汤; 可继续加食材"},
{"block": POT_WATER, "item": COD, "target": COD_SOUP,
"consume": 1, "tip": "§a放入鳕鱼, 变成 鳕鱼汤; 可继续加食材"},
{"block": POT_WATER, "item": SALMON, "target": SALMON_SOUP,
"consume": 1, "tip": "§a放入鲑鱼, 变成 鲑鱼汤; 可继续加食材"},
{"block": POT_WATER, "item": BEANCURD, "target": TOFU_SOUP,
"consume": 4, "tip": "§a放入豆腐x4, 变成 豆腐汤; 可继续加食材"},
# ---------------- 三、组合汤(汤底+汤底/食材 -> 组合汤底) ----------------
{"block": POTATO_SOUP, "item": CRUSHED_CARROTS, "target": CARROT_POTATO_SOUP,
"consume": 4, "tip": "§a土豆汤加胡萝卜碎x4, 变成 胡萝卜土豆汤; 可继续加肉/鱼"},
{"block": CARROT_SOUP, "item": POTATO_WEDGES, "target": CARROT_POTATO_SOUP,
"consume": 4, "tip": "§a胡萝卜汤加土豆块x4, 变成 胡萝卜土豆汤; 可继续加肉/鱼"},
{"block": RED_MUSHROOM_SOUP, "item": BROWN_MUSHROOM, "target": MUSHROOM_SOUP,
"consume": 5, "tip": "§a红蘑菇汤加棕蘑菇x5, 变成 蘑菇汤; 可继续加食材"},
{"block": BROWN_MUSHROOM_SOUP, "item": RED_MUSHROOM, "target": MUSHROOM_SOUP,
"consume": 5, "tip": "§a棕蘑菇汤加红蘑菇x5, 变成 蘑菇汤; 可继续加食材"},
{"block": POTATO_SOUP, "item": EGG, "target": POTATO_EGG_SOUP,
"consume": 3, "tip": "§a土豆汤加鸡蛋x3, 变成 土豆蛋花汤; 可继续加食材"},
{"block": EGG_SOUP, "item": POTATO_WEDGES, "target": POTATO_EGG_SOUP,
"consume": 4, "tip": "§a蛋花汤加土豆块x4, 变成 土豆蛋花汤; 可继续加食材"},
# ---------------- 四、加肉/鱼/豆腐 -> 汤羹(生), 开始计时 ----------------
{"block": CARROT_SOUP, "item": BEEF, "target": CARROT_BEEF_SOUP,
"consume": 2, "startTimer": CARROT_BEEF_SOUP,
"tip": "§a胡萝卜汤加生牛肉x2, 开始计时熬制(30秒/级); 等计时结束变成 胡萝卜牛肉汤(熟), 手持木碗出锅"},
{"block": CARROT_SOUP, "item": MUTTON, "target": LAMB_SOUP_WITH_TURNIPS,
"consume": 2, "startTimer": LAMB_SOUP_WITH_TURNIPS,
"tip": "§a胡萝卜汤加羊肉x2, 开始计时熬制(60秒/级); 等计时结束变成 胡萝卜羊肉汤(熟), 手持木碗出锅"},
{"block": CARROT_SOUP, "item": PORKRIB, "target": CARROT_RIBS,
"consume": 2, "startTimer": CARROT_RIBS,
"tip": "§a胡萝卜汤加猪肋排x2, 开始计时熬制(60秒/级); 等计时结束变成 胡萝卜排骨汤(熟), 手持木碗出锅"},
{"block": VEGETABLE_SOUP, "item": MUTTON, "target": VEGETABLE_BEEF_SOUP,
"consume": 2, "startTimer": VEGETABLE_BEEF_SOUP,
"tip": "§a蔬菜汤加羊肉x2, 开始计时熬制(60秒/级); 等计时结束变成 清汤羊肉(熟), 手持木碗出锅"},
{"block": VEGETABLE_SOUP, "item": BEEF, "target": VEGETABLE_LAMB_SOUP,
"consume": 2, "startTimer": VEGETABLE_LAMB_SOUP,
"tip": "§a蔬菜汤加生牛肉x2, 开始计时熬制(60秒/级); 等计时结束变成 蔬菜牛肉汤(熟), 手持木碗出锅"},
{"block": VEGETABLE_SOUP, "item": CRUSHED_MEAT, "target": VEGETABLE_LEAN_BROTH,
"consume": 5, "startTimer": VEGETABLE_LEAN_BROTH,
"tip": "§a蔬菜汤加碎肉x5, 开始计时熬制(60秒/级); 等计时结束变成 蔬菜瘦肉汤(熟), 手持木碗出锅"},
{"block": VEGETABLE_SOUP, "item": CARROT_POTATO_SOUP, "target": VEGETABLE_SSTEW,
"consume": 1, "drop": POT_EMPTY, "startTimer": VEGETABLE_SSTEW,
"tip": "§a蔬菜汤加胡萝卜土豆汤, 变成 蔬菜乱炖(生), 掉落一个汤锅(空); 等计时结束变熟, 手持木碗出锅"},
{"block": CARROT_POTATO_SOUP, "item": VEGETABLE, "target": VEGETABLE_SSTEW,
"consume": 3, "startTimer": VEGETABLE_SSTEW,
"tip": "§a胡萝卜土豆汤加青菜碎x3, 变成 蔬菜乱炖(生); 等计时结束变熟, 手持木碗出锅"},
{"block": CARROT_POTATO_SOUP, "item": COW_RIBS, "target": BEEF_BONE_BROTH,
"consume": 2, "startTimer": BEEF_BONE_BROTH,
"tip": "§a胡萝卜土豆汤加牛肋x2, 开始计时熬制(60秒/级); 等计时结束变成 胡萝卜土豆牛骨汤(熟), 手持木碗出锅"},
{"block": CARROT_POTATO_SOUP, "item": MUTTON, "target": LAMB_STEW,
"consume": 2, "startTimer": LAMB_STEW,
"tip": "§a胡萝卜土豆汤加羊肉x2, 开始计时熬制(60秒/级); 等计时结束变成 土豆胡萝卜炖羊肉(熟), 手持木碗出锅"},
{"block": CARROT_POTATO_SOUP, "item": SHEEP_RACKS, "target": VEGETABLE_POTATOES_LAMBSTEAK,
"consume": 2, "startTimer": VEGETABLE_POTATOES_LAMBSTEAK,
"tip": "§a胡萝卜土豆汤加羊小排x2, 开始计时熬制(60秒/级); 等计时结束变成 胡萝卜土豆羊排汤(熟), 手持木碗出锅"},
{"block": CARROT_SOUP, "item": COD, "target": CARROT_COD_SOUP,
"consume": 1, "startTimer": CARROT_COD_SOUP,
"tip": "§a胡萝卜汤加鳕鱼, 开始计时熬制(60秒/级); 等计时结束变成 胡萝卜鳕鱼汤(熟), 手持木碗出锅"},
{"block": CARROT_SOUP, "item": SALMON, "target": CARROT_FISH_SOUP,
"consume": 1, "startTimer": CARROT_FISH_SOUP,
"tip": "§a胡萝卜汤加鲑鱼, 开始计时熬制(60秒/级); 等计时结束变成 胡萝卜鲑鱼汤(熟), 手持木碗出锅"},
{"block": COD_SOUP, "item": EGG, "target": EGG_COD_SOUP,
"consume": 3, "startTimer": EGG_COD_SOUP,
"tip": "§a鳕鱼汤加鸡蛋x3, 开始计时熬制(60秒/级); 等计时结束变成 蛋花鳕鱼汤(熟), 手持木碗出锅"},
{"block": EGG_SOUP, "item": COD, "target": EGG_COD_SOUP,
"consume": 1, "startTimer": EGG_COD_SOUP,
"tip": "§a蛋花汤加鳕鱼, 开始计时熬制(60秒/级); 等计时结束变成 蛋花鳕鱼汤(熟), 手持木碗出锅"},
{"block": EGG_SOUP, "item": CRUSHED_MEAT, "target": NORI_EGG_SOUP,
"consume": 5, "startTimer": NORI_EGG_SOUP,
"tip": "§a蛋花汤加碎肉x5, 开始计时熬制(30秒/级); 等计时结束变成 瘦肉蛋花汤(熟), 手持木碗出锅"},
{"block": VEGETABLE_LEAN_BROTH, "item": EGG, "target": NORI_EGG_SOUP,
"consume": 3, "startTimer": NORI_EGG_SOUP,
"tip": "§a蔬菜瘦肉汤加鸡蛋x3, 开始计时熬制(30秒/级); 等计时结束变成 瘦肉蛋花汤(熟), 手持木碗出锅"},
{"block": TOFU_SOUP, "item": SALMON, "target": TOFU_FISH_SOUP_RAW,
"consume": 1, "startTimer": TOFU_FISH_SOUP_RAW,
"tip": "§a豆腐汤加鲑鱼, 开始计时熬制(60秒/级); 等计时结束变成 豆腐鲑鱼汤(熟), 手持木碗出锅"},
{"block": SALMON_SOUP, "item": BEANCURD, "target": TOFU_FISH_SOUP_RAW,
"consume": 4, "startTimer": TOFU_FISH_SOUP_RAW,
"tip": "§a鲑鱼汤加豆腐x4, 开始计时熬制(60秒/级); 等计时结束变成 豆腐鲑鱼汤(熟), 手持木碗出锅"},
{"block": MUSHROOM_SOUP, "item": CHICKEN, "target": CHICKEN_STEW_MUSHROOMS,
"consume": 1, "startTimer": CHICKEN_STEW_MUSHROOMS,
"tip": "§a蘑菇汤加生鸡肉, 开始计时熬制(90秒/级); 等计时结束变成 蘑菇炖鸡(熟), 手持木碗出锅"},
{"block": VEGETABLE_SOUP, "item": SASHIMI, "target": VEGETABLE_FISH_SOUP_0,
"consume": 10, "startTimer": VEGETABLE_FISH_SOUP_0,
"tip": "§a蔬菜汤加生鱼片x10, 开始计时熬制(60秒/级); 等计时结束变成 蔬菜鱼片汤(熟), 手持木碗出锅"},
# ---------------- 五、单独菜谱 ----------------
# 菜谱29 猪蹄汤
{"block": POT_WATER, "item": HAM, "target": RAW_PIG_FOOD_SOUP_0,
"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, 开始计时熬制(30秒/级); 等计时结束变成 猪蹄汤(全熟), 手持木碗出锅"},
# 菜谱30 羊肉泡馍汤
{"block": POT_WATER, "item": MO, "target": ROUJIAMO_SOUP_0,
"consume": 1, "startTimer": ROUJIAMO_SOUP_0,
"tip": "§a放入馍, 开始计时熬制(30秒); 等计时结束变成 羊肉泡馍汤(熟), 手持木碗出锅"},
# 菜谱31 生面汤
{"block": POT_WATER, "item": NOODLES, "target": RAW_NOODLE_SOUP,
"consume": 1, "startTimer": RAW_NOODLE_SOUP,
"tip": "§a放入生面, 开始计时熬制(60秒); 等计时结束变成 熟面汤, 手持木碗盛出 熟面条"},
# 菜谱32 饺子汤
{"block": POT_WATER, "item": DUMPLINGS, "target": DUMPLINGS_SOUP_0,
"consume": 1, "startTimer": DUMPLINGS_SOUP_0,
"tip": "§a放入生饺子, 开始计时熬制(60秒/级); 等计时结束变成 饺子汤(熟), 手持木碗盛出 饺子_碗装"},
# 菜谱35 生米锅
{"block": POT_WATER, "item": BROWN_RICE, "target": RAW_RICE_POT,
"consume": 64, "startTimer": RAW_RICE_POT,
"tip": "§a放入大米x64, 变成 生米锅; 开始计时熬制(90秒)结束变成 熟米饭(形态随机)"},
# 菜谱39 煮鸡蛋(生)
{"block": POT_WATER, "item": EGG_PILE, "target": RAW_EGG_SOUP,
"consume": 1, "startTimer": RAW_EGG_SOUP,
"tip": "§a放入鸡蛋堆, 开始计时熬制(60秒); 等计时结束变成 煮鸡蛋(熟), 空手右键取出 水煮蛋x9"},
# 菜谱42 煮豆腐(生)
{"block": POT_WATER, "item": SOYMILK, "target": BEANCURD_SOUP_0,
"consume": 1, "startTimer": BEANCURD_SOUP_0,
"tip": "§a倒入豆浆, 开始计时熬制(60秒); 等计时结束变成 煮豆腐(熟), 拿菜刀右键切成 豆腐x16"},
# ---------------- 六、出锅(熟汤羹+木碗 -> 碗装成品, 锅变回汤锅(空)) ----------------
{"block": CARROT_BEEF_SOUP_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_CARROT_BEEF, "consume": 1,
"tip": "§a盛出 胡萝卜牛肉汤, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": LAMB_SOUP_WITH_TURNIPS_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_LAMB_TURNIP, "consume": 1,
"tip": "§a盛出 胡萝卜羊肉汤, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": CARROT_RIBS_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_CARROT_RIBS, "consume": 1,
"tip": "§a盛出 胡萝卜排骨汤, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": VEGETABLE_BEEF_SOUP_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_VEGETABLE_BEEF, "consume": 1,
"tip": "§a盛出 清汤羊肉, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": VEGETABLE_LAMB_SOUP_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_VEGETABLE_LAMB, "consume": 1,
"tip": "§a盛出 蔬菜牛肉汤, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": VEGETABLE_LEAN_BROTH_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_VEGETABLE_LEAN, "consume": 1,
"tip": "§a盛出 蔬菜瘦肉汤, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": VEGETABLE_SSTEW_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_VEGETABLE_SSTEW, "consume": 1,
"tip": "§a盛出 蔬菜乱炖, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": BEEF_BONE_BROTH_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_BEEF_BONE, "consume": 1,
"tip": "§a盛出 胡萝卜土豆牛骨汤, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": LAMB_STEW_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_LAMB_STEW, "consume": 1,
"tip": "§a盛出 土豆胡萝卜炖羊肉, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": LAMB_CHOP_SOUP_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_LAMB_CHOP, "consume": 1,
"tip": "§a盛出 胡萝卜土豆羊排汤, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": CARROT_COD_SOUP_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_CARROT_COD, "consume": 1,
"tip": "§a盛出 胡萝卜鳕鱼汤, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": CARROT_FISH_SOUP_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_CARROT_FISH, "consume": 1,
"tip": "§a盛出 胡萝卜鲑鱼汤, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": EGG_COD_SOUP_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_EGG_COD, "consume": 1,
"tip": "§a盛出 蛋花鳕鱼汤, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": NORI_EGG_SOUP_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_NORI_EGG, "consume": 1,
"tip": "§a盛出 瘦肉蛋花汤, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": TOFU_FISH_SOUP_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_TOFU_FISH, "consume": 1,
"tip": "§a盛出 豆腐鲑鱼汤, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": CHICKEN_STEW_MUSHROOMS_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_MUSHROOM_CHICKEN, "consume": 1,
"tip": "§a盛出 蘑菇炖鸡, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": RAW_PIG_FOOD_SOUP_5, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_PIG_FOOT, "consume": 1,
"tip": "§a盛出 猪蹄汤, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": ROUJIAMO_SOUP_1, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_ROUJIAMO, "consume": 1,
"tip": "§a盛出 羊肉泡馍汤, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": COOKED_NOODLE_SOUP, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_NOODLE, "consume": 1,
"tip": "§a盛出 熟面条, 锅变回 汤锅(空); 熟面条可做汤面"},
{"block": DUMPLINGS_SOUP_2, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_DUMPLINGS, "consume": 1,
"tip": "§a盛出 饺子_碗装, 锅变回 汤锅(空); 成品【吃】右键食用"},
{"block": VEGETABLE_FISH_SOUP_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_VEGETABLE_FISH, "consume": 1,
"tip": "§a盛出 蔬菜鱼片汤, 锅变回 汤锅(空); 成品【吃】右键食用"},
# 菜谱38 碗装米饭(木碗盛出)
{"block": RICE_POT_1, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_RICE_1, "consume": 1,
"tip": "§a盛出 米饭_1(熟米饭_形态1), 锅变回 汤锅(空); 碗装米饭供炒锅蛋炒饭"},
{"block": RICE_POT_2, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_RICE_2, "consume": 1,
"tip": "§a盛出 米饭_2(熟米饭_形态2), 锅变回 汤锅(空); 碗装米饭供炒锅蛋炒饭"},
{"block": RICE_POT_3, "item": BOWL, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOWL_RICE_3, "consume": 1,
"tip": "§a盛出 米饭_3(熟米饭_形态3), 锅变回 汤锅(空); 碗装米饭供炒锅蛋炒饭"},
# ---------------- 七、取出(空手/菜刀, 锅变回汤锅(空)) ----------------
# 菜谱37 饭团
{"block": RICE_POT_1, "item": None, "action": "take_out",
"target": POT_EMPTY, "dropItem": RICE_BALLS, "count": 16,
"tip": "§a捏成 饭团x16, 锅变回 汤锅(空); 饭团供寿司用"},
{"block": RICE_POT_2, "item": None, "action": "take_out",
"target": POT_EMPTY, "dropItem": RICE_BALLS, "count": 16,
"tip": "§a捏成 饭团x16, 锅变回 汤锅(空); 饭团供寿司用"},
{"block": RICE_POT_3, "item": None, "action": "take_out",
"target": POT_EMPTY, "dropItem": RICE_BALLS, "count": 16,
"tip": "§a捏成 饭团x16, 锅变回 汤锅(空); 饭团供寿司用"},
# 菜谱41 水煮蛋
{"block": COOKED_EGG_SOUP, "item": None, "action": "take_out",
"target": POT_EMPTY, "dropItem": BOILED_EGG, "count": 9,
"tip": "§a取出 水煮蛋x9, 锅变回 汤锅(空); 水煮蛋【吃】右键食用"},
# 菜谱44 豆腐(菜刀切, 不消耗刀)
{"block": BEANCURD_SOUP_1, "item": CLEAVER, "action": "take_out",
"target": POT_EMPTY, "dropItem": BEANCURD, "count": 16,
"tip": "§a切出 豆腐x16, 锅变回 汤锅(空); 豆腐供炒锅/汤锅使用"},
# ---------------- 八、汤面分组(手持汤锅成品菜 右键 熟面条(方块)) ----------------
{"block": BOWL_NOODLE, "item": BOWL_CARROT_RIBS, "target": NOODLESOUP_1,
"consume": 1, "drop": BOWL,
"tip": "§a排骨汤浇在面条上, 变成 猪排蔬菜面, 掉落一个木碗; 汤面【吃】右键食用"},
{"block": BOWL_NOODLE, "item": BOWL_LAMB_CHOP, "target": NOODLESOUP_2,
"consume": 1, "drop": BOWL,
"tip": "§a羊排汤浇在面条上, 变成 羊排蔬菜面, 掉落一个木碗; 汤面【吃】右键食用"},
{"block": BOWL_NOODLE, "item": BOWL_BEEF_BONE, "target": NOODLESOUP_3,
"consume": 1, "drop": BOWL,
"tip": "§a牛骨汤浇在面条上, 变成 牛骨面, 掉落一个木碗; 汤面【吃】右键食用"},
{"block": BOWL_NOODLE, "item": BOWL_MUSHROOM_CHICKEN, "target": NOODLESOUP_4,
"consume": 1, "drop": BOWL,
"tip": "§a蘑菇炖鸡浇在面条上, 变成 小鸡炖蘑菇面, 掉落一个木碗; 汤面【吃】右键食用"},
{"block": BOWL_NOODLE, "item": BOWL_VEGETABLE_SSTEW, "target": ASSORTED_RAMEN,
"consume": 1, "drop": BOWL,
"tip": "§a蔬菜乱炖浇在面条上, 变成 胡萝卜蔬菜面, 掉落一个木碗; 汤面【吃】右键食用"},
{"block": BOWL_NOODLE, "item": BOWL_VEGETABLE_LAMB, "target": BRAISED_NOODLES,
"consume": 1, "drop": BOWL,
"tip": "§a蔬菜牛肉汤浇在面条上, 变成 胡萝卜蔬菜牛肉面, 掉落一个木碗; 汤面【吃】右键食用"},
{"block": BOWL_NOODLE, "item": MUSHROOM_SOUP, "target": MUSHROOM_NOODLES,
"consume": 1, "drop": BOWL,
"tip": "§a蘑菇汤浇在面条上, 变成 香菇面, 掉落一个木碗; 汤面【吃】右键食用"},
{"block": BOWL_NOODLE, "item": BOWL_VEGETABLE_FISH, "target": YUSHENG_RAMEN,
"consume": 1, "drop": BOWL,
"tip": "§a蔬菜鱼片汤浇在面条上, 变成 蔬菜鱼片面, 掉落一个木碗; 汤面【吃】右键食用"},
{"block": BOWL_NOODLE, "item": VEGETABLE_SOUP, "target": VEGETABLE_NOODLES,
"consume": 1, "drop": BOWL,
"tip": "§a蔬菜汤浇在面条上, 变成 蔬菜面, 掉落一个木碗; 汤面【吃】右键食用"},
{"block": BOWL_NOODLE, "item": EGG_SOUP, "target": NOODLES_1,
"consume": 1, "drop": BOWL,
"tip": "§a蛋花汤浇在面条上, 变成 蛋花面, 掉落一个木碗; 可加葱花碎 或 直接【吃】"},
{"block": BOWL_NOODLE, "item": BOILED_EGG, "target": EGG_NOODLES,
"consume": 1, "drop": BOWL,
"tip": "§a放上水煮蛋, 变成 鸡蛋面, 掉落一个木碗; 汤面【吃】右键食用"},
# 蛋花面(加葱花)
{"block": NOODLES_1, "item": SCALLIONS, "target": NOODLES_2,
"consume": 1, "tip": "§a蛋花面撒上葱花碎, 变成 蛋花面(加葱花); 汤面【吃】右键食用"},
# 猪排蔬菜面加水煮蛋(猪排蔬菜面 + 水煮蛋)
{"block": NOODLESOUP_1, "item": BOILED_EGG, "target": TONKOTSU_RAMEN,
"consume": 1, "tip": "§a猪排蔬菜面放上水煮蛋, 变成 猪排蔬菜面加水煮蛋; 汤面【吃】右键食用"},
]
# ============================================================================
# 七、计时规则(供 TangguoTimerService)
# below: 汤羹方块正下方须是 点燃的炉灶(stove_2) 才计时
# randomTargets: 生米锅到点后随机出其一形态
# ============================================================================
TIMER_RULES = [
# 胡萝卜牛肉汤(30秒/级)
{"source": CARROT_BEEF_SOUP, "target": CARROT_BEEF_SOUP_1, "time": 30,
"below": [LIT_STOVE], "autoStart": True},
{"source": CARROT_BEEF_SOUP_1, "target": CARROT_BEEF_SOUP_2, "time": 30,
"below": [LIT_STOVE], "autoStart": True},
{"source": CARROT_BEEF_SOUP_2, "target": CARROT_BEEF_SOUP_3, "time": 30,
"below": [LIT_STOVE], "autoStart": True},
# 胡萝卜羊肉汤(60秒/级)
{"source": LAMB_SOUP_WITH_TURNIPS, "target": LAMB_SOUP_WITH_TURNIPS_1, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": LAMB_SOUP_WITH_TURNIPS_1, "target": LAMB_SOUP_WITH_TURNIPS_2, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": LAMB_SOUP_WITH_TURNIPS_2, "target": LAMB_SOUP_WITH_TURNIPS_3, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 胡萝卜排骨汤(60秒/级)
{"source": CARROT_RIBS, "target": CARROT_RIBS_1, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": CARROT_RIBS_1, "target": CARROT_RIBS_2, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": CARROT_RIBS_2, "target": CARROT_RIBS_3, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 清汤羊肉(60秒/级)
{"source": VEGETABLE_BEEF_SOUP, "target": VEGETABLE_BEEF_SOUP_1, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": VEGETABLE_BEEF_SOUP_1, "target": VEGETABLE_BEEF_SOUP_2, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": VEGETABLE_BEEF_SOUP_2, "target": VEGETABLE_BEEF_SOUP_3, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 蔬菜牛肉汤(60秒/级)
{"source": VEGETABLE_LAMB_SOUP, "target": VEGETABLE_LAMB_SOUP_1, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": VEGETABLE_LAMB_SOUP_1, "target": VEGETABLE_LAMB_SOUP_2, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": VEGETABLE_LAMB_SOUP_2, "target": VEGETABLE_LAMB_SOUP_3, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 蔬菜瘦肉汤(60秒/级)
{"source": VEGETABLE_LEAN_BROTH, "target": VEGETABLE_LEAN_BROTH_1, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": VEGETABLE_LEAN_BROTH_1, "target": VEGETABLE_LEAN_BROTH_2, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": VEGETABLE_LEAN_BROTH_2, "target": VEGETABLE_LEAN_BROTH_3, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 蔬菜乱炖(60秒/级)
{"source": VEGETABLE_SSTEW, "target": VEGETABLE_SSTEW_1, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": VEGETABLE_SSTEW_1, "target": VEGETABLE_SSTEW_2, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": VEGETABLE_SSTEW_2, "target": VEGETABLE_SSTEW_3, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 胡萝卜土豆牛骨汤(60秒/级)
{"source": BEEF_BONE_BROTH, "target": BEEF_BONE_BROTH_1, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": BEEF_BONE_BROTH_1, "target": BEEF_BONE_BROTH_2, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": BEEF_BONE_BROTH_2, "target": BEEF_BONE_BROTH_3, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 土豆胡萝卜炖羊肉(60秒/级)
{"source": LAMB_STEW, "target": LAMB_STEW_1, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": LAMB_STEW_1, "target": LAMB_STEW_2, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": LAMB_STEW_2, "target": LAMB_STEW_3, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 胡萝卜土豆羊排汤(60秒/级)
{"source": VEGETABLE_POTATOES_LAMBSTEAK, "target": LAMB_CHOP_SOUP_1, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": LAMB_CHOP_SOUP_1, "target": LAMB_CHOP_SOUP_2, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": LAMB_CHOP_SOUP_2, "target": LAMB_CHOP_SOUP_3, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 胡萝卜鳕鱼汤(60秒/级)
{"source": CARROT_COD_SOUP, "target": CARROT_COD_SOUP_1, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": CARROT_COD_SOUP_1, "target": CARROT_COD_SOUP_2, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": CARROT_COD_SOUP_2, "target": CARROT_COD_SOUP_3, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 胡萝卜鲑鱼汤(60秒/级)
{"source": CARROT_FISH_SOUP, "target": CARROT_FISH_SOUP_1, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": CARROT_FISH_SOUP_1, "target": CARROT_FISH_SOUP_2, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": CARROT_FISH_SOUP_2, "target": CARROT_FISH_SOUP_3, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 蛋花鳕鱼汤(60秒/级)
{"source": EGG_COD_SOUP, "target": EGG_COD_SOUP_1, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": EGG_COD_SOUP_1, "target": EGG_COD_SOUP_2, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": EGG_COD_SOUP_2, "target": EGG_COD_SOUP_3, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 瘦肉蛋花汤(30秒/级, 四段)
{"source": NORI_EGG_SOUP, "target": NORI_EGG_SOUP_0, "time": 30,
"below": [LIT_STOVE], "autoStart": True},
{"source": NORI_EGG_SOUP_0, "target": NORI_EGG_SOUP_1, "time": 30,
"below": [LIT_STOVE], "autoStart": True},
{"source": NORI_EGG_SOUP_1, "target": NORI_EGG_SOUP_2, "time": 30,
"below": [LIT_STOVE], "autoStart": True},
{"source": NORI_EGG_SOUP_2, "target": NORI_EGG_SOUP_3, "time": 30,
"below": [LIT_STOVE], "autoStart": True},
# 豆腐鲑鱼汤(60秒/级, 生=tufusoupb)
{"source": TOFU_FISH_SOUP_RAW, "target": TOFU_FISH_SOUP_1, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": TOFU_FISH_SOUP_1, "target": TOFU_FISH_SOUP_2, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": TOFU_FISH_SOUP_2, "target": TOFU_FISH_SOUP_3, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 蘑菇炖鸡(90秒/级)
{"source": CHICKEN_STEW_MUSHROOMS, "target": CHICKEN_STEW_MUSHROOMS_1, "time": 90,
"below": [LIT_STOVE], "autoStart": True},
{"source": CHICKEN_STEW_MUSHROOMS_1, "target": CHICKEN_STEW_MUSHROOMS_2, "time": 90,
"below": [LIT_STOVE], "autoStart": True},
{"source": CHICKEN_STEW_MUSHROOMS_2, "target": CHICKEN_STEW_MUSHROOMS_3, "time": 90,
"below": [LIT_STOVE], "autoStart": True},
# 猪蹄汤(30秒/级, 加土豆->三分熟->七分熟->全熟)
{"source": RAW_PIG_FOOD_SOUP_2, "target": RAW_PIG_FOOD_SOUP_3, "time": 30,
"below": [LIT_STOVE], "autoStart": True},
{"source": RAW_PIG_FOOD_SOUP_3, "target": RAW_PIG_FOOD_SOUP_4, "time": 30,
"below": [LIT_STOVE], "autoStart": True},
{"source": RAW_PIG_FOOD_SOUP_4, "target": RAW_PIG_FOOD_SOUP_5, "time": 30,
"below": [LIT_STOVE], "autoStart": True},
# 羊肉泡馍汤(单级30秒)
{"source": ROUJIAMO_SOUP_0, "target": ROUJIAMO_SOUP_1, "time": 30,
"below": [LIT_STOVE], "autoStart": True},
# 生面汤(单级60秒)
{"source": RAW_NOODLE_SOUP, "target": COOKED_NOODLE_SOUP, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 饺子汤(60秒/级)
{"source": DUMPLINGS_SOUP_0, "target": DUMPLINGS_SOUP_1, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
{"source": DUMPLINGS_SOUP_1, "target": DUMPLINGS_SOUP_2, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 生米锅(一级90秒, 形态随机)
{"source": RAW_RICE_POT, "time": 90, "below": [LIT_STOVE], "autoStart": True,
"randomTargets": [RICE_POT_1, RICE_POT_2, RICE_POT_3]},
# 煮鸡蛋(单级60秒)
{"source": RAW_EGG_SOUP, "target": COOKED_EGG_SOUP, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
# 煮豆腐(单级60秒)
{"source": BEANCURD_SOUP_0, "target": BEANCURD_SOUP_1, "time": 60,
"below": [LIT_STOVE], "autoStart": True},
]
@@ -0,0 +1 @@
# -*- coding: utf-8 -*-
@@ -0,0 +1,228 @@
# -*- coding: utf-8 -*-
"""
================================================================================
汤锅·右键转换引擎(服务端)
================================================================================
处理"汤锅"(xy_tangguo) 分类下的右键转换:
汤锅(空)<->(加水)、盖/掀锅盖、下汤底、组合汤、
加肉/鱼/豆腐(开始计时)、出锅(熟汤羹+木碗->碗装成品)、
取出(饭团/水煮蛋/豆腐)、汤面(成品菜浇熟面条)
【事件监听在哪?】
本类【不】监听任何事件!
所有事件由 FeatureDispatcher 统一监听, 按 blockOwner 路由到本类 handleBlockUse。
【本类怎么做】
handleBlockUse <- 入口: 分发器转发右键方块事件
└─ handleSwitch <- 通用转换(含 空手右键/出锅/取出)
【计时在?】
加肉/鱼后熬制计时在 TangguoTimerService, 本类只负责"开始计时"(startTimer 字段调
FeatureDispatcher.startTimerFor 转发); 下方无点燃炉灶时提示玩家。
================================================================================
"""
import time
import mod.server.extraServerApi as serverApi
# ---- 网易API基础对象 ----
ServerSystem = serverApi.GetServerSystemCls() # 服务端系统基类
comp = serverApi.GetEngineCompFactory() # 组件工厂
# ---- 继承 BlueFox 框架的系统基类(提供 CreateEngineItemEntity 等方法) ----
from ....BlueFoxTools.SpecialFunciton.BlueFoxSystem import BlueFoxServerSystem
from ....BlueFoxTools.ToolsConfig import LevelId
# ---- 只导入汤锅自己的数据库 ----
from ..TangguoData import SWITCH_RULES
# ---- 统一分发器 ----
from ...service.FeatureDispatcher import FeatureDispatcher
class TangguoService(BlueFoxServerSystem):
"""
汤锅·右键转换引擎
"""
def __init__(self, namespace, systemName):
super(TangguoService, self).__init__(namespace, systemName)
print "===== TangguoService init ====="
# ---- (方块, 手持物品) -> 规则: O(1) 查找 (item=None 表示空手右键) ----
self.recipes = {}
self.featureBlocks = set()
for r in SWITCH_RULES:
self.recipes[(r["block"], r.get("item"))] = r
self.featureBlocks.add(r["block"])
# ---- 右键冷却表 ----
self.cooldown = {}
# ---- 注册到统一分发器 ----
FeatureDispatcher.register(self)
# ============================================================================
# 一、给 FeatureDispatcher 的接口
# ============================================================================
def getFeatureBlocks(self):
"""返回本功能管辖的所有右键方块名集合"""
return self.featureBlocks
def getItemUseOnRules(self):
"""手持物品右键方块表面不需要单独路由(所有转换都是右键方块本身), 返回空"""
return {}
def handleBlockUse(self, args):
"""由 FeatureDispatcher 转发的右键方块入口"""
blockName = args.get("blockName")
playerId = args.get("playerId")
x, y, z = args.get("x"), args.get("y"), args.get("z")
pos = (x, y, z)
dim = comp.CreateDimension(playerId).GetEntityDimensionId()
key = (dim, x, y, z)
itemDict = self.getCarriedItem(playerId)
itemName = itemDict.get("newItemName") if itemDict else None
if itemName == "minecraft:air":
itemName = None
recipe = self.recipes.get((blockName, itemName))
if not recipe:
return False
if not self.checkCooldown(key, 0.4):
return True
self.handleSwitch(recipe, playerId, pos, dim, itemDict)
return True
# ============================================================================
# 二、通用转换执行
# ============================================================================
def handleSwitch(self, recipe, playerId, pos, dim, itemDict):
# 消耗物品(数量不足则拦截, 不转换)
consume = recipe.get("consume", 0)
if consume > 1 and itemDict is not None and (itemDict.get("count") or 0) < consume:
comp.CreateMsg(playerId).NotifyOneMessage(
playerId, "§c数量不足, 需要 %d 个" % consume)
return
if consume > 0:
self.consumeItem(playerId, itemDict, consume)
# 出锅/取出: 熟汤羹+木碗 -> 碗装成品; 熟米饭->饭团/碗装米饭;
# 煮鸡蛋->水煮蛋; 煮豆腐->豆腐. 锅都变回 汤锅(空)
action = recipe.get("action")
if action == "take_out":
self.replaceBlock(pos, dim, recipe.get("target") or self._defaultPot(), playerId)
self.dropItem(dim, pos, recipe["dropItem"], recipe.get("count", 1))
# 普通替换方块(加水/盖锅/下汤底/组合/加料/汤面)
if recipe.get("target") and action != "take_out":
self.replaceBlock(pos, dim, recipe["target"], playerId)
# 额外掉落(倒水掉水桶 / 蔬菜乱炖掉汤锅(空) / 汤面掉木碗)
if recipe.get("drop"):
self.dropItem(dim, pos, recipe["drop"])
# 加料后启动计时(记录发起玩家); 下方无点燃炉灶时提示
if recipe.get("startTimer"):
started = FeatureDispatcher.startTimerFor(
recipe["startTimer"], dim, pos, playerId)
if not started:
comp.CreateMsg(playerId).NotifyOneMessage(
playerId, "§e熬制需要下方是 点燃的炉灶; 放上炉灶后会自动开始计时")
# 给背包物品(加水给空桶)
if recipe.get("give"):
self.giveItem(playerId, recipe["give"])
# 提示
if recipe.get("tip"):
comp.CreateMsg(playerId).NotifyOneMessage(playerId, recipe["tip"])
def _defaultPot(self):
"""take_out 未指定 target 时回退(正常应总是带 target=汤锅(空))"""
return "rtdd:stewedsoup"
# ============================================================================
# 三、工具方法:获取玩家主手物品
# ============================================================================
def getCarriedItem(self, playerId):
itemComp = comp.CreateItem(playerId)
return itemComp.GetPlayerItem(
serverApi.GetMinecraftEnum().ItemPosType.CARRIED, 0, True)
# ============================================================================
# 四、工具方法:给玩家物品
# ============================================================================
def giveItem(self, playerId, itemName, count=1, aux=0):
try:
itemDict = {"itemName": itemName, "count": count, "auxValue": aux}
comp.CreateItem(playerId).SpawnItemToPlayerInv(itemDict, playerId)
except Exception:
pass
# ============================================================================
# 五、工具方法:消耗物品
# ============================================================================
def consumeItem(self, playerId, itemDict, amount=1):
if itemDict is None:
return
count = itemDict.get("count", 0)
if count <= amount:
comp.CreateItem(playerId).SetEntityItem(
serverApi.GetMinecraftEnum().ItemPosType.CARRIED,
{"itemName": "minecraft:air", "count": 0, "auxValue": 0})
else:
itemDict["count"] = count - amount
comp.CreateItem(playerId).SetEntityItem(
serverApi.GetMinecraftEnum().ItemPosType.CARRIED,
{"itemName": itemDict["newItemName"],
"count": itemDict["count"],
"auxValue": itemDict.get("newAuxValue", 0),
"userData": itemDict.get("userData", {})})
# ============================================================================
# 六、工具方法:以掉落物形式生成物品
# ============================================================================
def dropItem(self, dim, pos, itemName, count=1, aux=0):
try:
itemDict = {"itemName": itemName, "count": count, "auxValue": aux}
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
except Exception:
pass
# ============================================================================
# 七、工具方法:替换方块 / 清空方块(清空时 aux 强制 0, 兼容定向变体)
# ============================================================================
def replaceBlock(self, pos, dim, newBlockName, playerId=None):
creator = playerId if playerId is not None else LevelId
aux = 0
try:
oldBlock = comp.CreateBlockInfo(creator).GetBlockNew(pos, dim)
aux = oldBlock.get("aux", 0)
except Exception:
aux = 0
comp.CreateBlockInfo(creator).SetBlockNew(
pos, blockDict={"name": newBlockName, "aux": aux},
oldBlockHandling=0, dimensionId=dim)
def clearBlock(self, pos, dim):
comp.CreateBlockInfo(LevelId).SetBlockNew(
pos, blockDict={"name": "minecraft:air", "aux": 0},
oldBlockHandling=0, dimensionId=dim)
# ============================================================================
# 八、工具方法:冷却检查
# ============================================================================
def checkCooldown(self, key, cd=0.4):
now = time.time()
last = self.cooldown.get(key, 0)
if now - last < cd:
return False
self.cooldown[key] = now
return True
@@ -0,0 +1,234 @@
# -*- coding: utf-8 -*-
"""
================================================================================
汤锅·计时熬制引擎(服务端)
================================================================================
只处理"汤锅"(xy_tangguo) 分类下的【计时自动转换】:
汤羹(生) -> (四分熟) -> (八分熟) -> (熟)
瘦肉蛋花汤: 生->三分熟->七分熟->全熟->熟; 猪蹄汤: 加土豆->三分熟->七分熟->全熟
生米锅: 一级计时到点后 熟米饭形态1/2/3 随机出一个
煮鸡蛋/煮豆腐/生面汤/饺子汤/羊肉泡馍汤: 单级/双级计时
【计时判定(用户指定, 与油锅一致)】
- 汤羹方块【正下方】必须是 点燃的炉灶(stove_2) 才开始计时
- 计时数据仍在【汤羹方块本身】上(汤羹方块 tick 时判定下方炉灶)
- 炉灶被移走/熄灭 -> 暂停计时(数据保留, 炉灶回来继续) + 提示发起玩家
【事件监听在哪?】
本类【不】监听任何事件!
ServerBlockEntityTickEvent 由 FeatureDispatcher 统一监听, 再按 timerOwner
路由到本类的 handleBlockEntityTick。计时用绝对时间戳写方块实体数据,
退出重进继续计时。
================================================================================
"""
import time
import random
import mod.server.extraServerApi as serverApi
# ---- 网易API基础对象 ----
ServerSystem = serverApi.GetServerSystemCls() # 服务端系统基类
comp = serverApi.GetEngineCompFactory() # 组件工厂
# ---- 继承 BlueFox 框架的系统基类 ----
from ....BlueFoxTools.SpecialFunciton.BlueFoxSystem import BlueFoxServerSystem
from ....BlueFoxTools.ToolsConfig import LevelId
# ---- 方块实体数据组件(计时持久化: 开始时间戳+时长写进方块) ----
blockEntityDataComp = comp.CreateBlockEntityData(LevelId)
# ---- 只导入汤锅自己的数据库 ----
from ..TangguoData import TIMER_RULES
# ---- 统一分发器 ----
from ...service.FeatureDispatcher import FeatureDispatcher
class TangguoTimerService(BlueFoxServerSystem):
"""
汤锅·计时熬制引擎
"""
def __init__(self, namespace, systemName):
super(TangguoTimerService, self).__init__(namespace, systemName)
print "===== TangguoTimerService init ====="
# ---- 计时规则: source -> [规则...] ----
self.timerMap = {}
for t in TIMER_RULES:
self.timerMap.setdefault(t["source"], []).append(t)
# ---- 注册到分发器的计时路由表 ----
FeatureDispatcher.registerTimer(self)
# ============================================================================
# 一、给 FeatureDispatcher 的接口
# ============================================================================
def getTimerBlocks(self):
"""返回本功能的所有"计时源方块"集合(tick 路由用)"""
return set(self.timerMap.keys())
def handleBlockEntityTick(self, args):
"""由 FeatureDispatcher 转发的计时方块 tick 入口"""
dim = args.get("dimension")
pos = (args.get("posX"), args.get("posY"), args.get("posZ"))
blockName = args.get("blockName", "")
self._tickProcess(dim, pos, blockName)
# ============================================================================
# 二、启动计时(右键加料后由 TangguoService 通过 startTimerFor 转发)
# ============================================================================
def startTimer(self, dim, pos, blockName, playerId=None):
rules = self.timerMap.get(blockName)
if not rules:
return False
rule = self._pickRule(rules, dim, pos)
if not rule:
return False
try:
data = blockEntityDataComp.GetBlockEntityData(dim, pos)
if data and data["rtdd_tid"] == blockName:
return False
except Exception:
pass
self._writeTimerData(dim, pos, rule, playerId)
return True
# ============================================================================
# 三、tick 检查与到点转换
# ============================================================================
def _pickRule(self, rules, dim, pos):
"""按"下方方块"匹配规则(点燃炉灶), 返回命中的规则; 无命中返回 None"""
belowPos = (pos[0], pos[1] - 1, pos[2])
try:
b = comp.CreateBlockInfo(LevelId).GetBlockNew(belowPos, dim)
belowName = b.get("name") if b else ""
except Exception:
belowName = ""
for rule in rules:
if belowName in rule.get("below", [belowName]):
return rule
return None
def _tickProcess(self, dim, pos, blockName):
try:
rules = self.timerMap.get(blockName)
if not rules:
return
blockData = blockEntityDataComp.GetBlockEntityData(dim, pos)
if blockData is None:
return
try:
tid = blockData["rtdd_tid"]
except Exception:
tid = ""
if tid != blockName:
# autoStart: 计时源方块无计时数据且下方点燃炉灶时自动启动
if any(r.get("autoStart", True) for r in rules):
rule = self._pickRule(rules, dim, pos)
if rule:
self._writeTimerData(dim, pos, rule, None)
return
# 计时中: 下方点燃炉灶被移走/熄灭 -> 暂停 + 提示
rule = self._pickRule(rules, dim, pos)
if rule is None:
self._handleBelowBroken(dim, pos, blockName, blockData)
return
tstart = blockData["rtdd_tstart"]
tdur = blockData["rtdd_tdur"]
if time.time() - tstart >= tdur:
self._finishTimer(dim, pos, rule)
except Exception:
pass
def _handleBelowBroken(self, dim, pos, blockName, data):
"""下方点燃炉灶被移走/熄灭: 暂停计时(数据保留, 炉灶回来继续) + 提示发起玩家"""
tp = ""
try:
tp = data["rtdd_tp"] or ""
except Exception:
tp = ""
self._notifyIfOnline(tp, "§c汤锅下的炉灶移走了, 暂停熬制")
def _finishTimer(self, dim, pos, rule):
"""到点转换(只保留开始提示; 炉灶移走提示走 _handleBelowBroken)"""
try:
cur = comp.CreateBlockInfo(LevelId).GetBlockNew(pos, dim)
if cur and cur.get("name") != rule["source"]:
self._clearTimerData(dim, pos)
return
# 生米锅: 一级计时到点后 三种形态随机出一个
if rule.get("randomTargets"):
target = random.choice(rule["randomTargets"])
else:
target = rule["target"]
self.replaceBlock(pos, dim, target, None)
self._clearTimerData(dim, pos)
except Exception:
pass
# ============================================================================
# 四、计时数据读写(存在方块实体数据里,重启不丢)
# ============================================================================
def _writeTimerData(self, dim, pos, recipe, playerId=None):
try:
blockData = blockEntityDataComp.GetBlockEntityData(dim, pos)
if blockData is None:
return
now = time.time()
blockData["rtdd_tid"] = recipe["source"]
blockData["rtdd_tstart"] = now
blockData["rtdd_tdur"] = recipe.get("time", 60)
blockData["rtdd_tp"] = playerId if playerId else ""
except Exception:
pass
def _clearTimerData(self, dim, pos):
try:
blockData = blockEntityDataComp.GetBlockEntityData(dim, pos)
if blockData is None:
return
blockData["rtdd_tid"] = ""
blockData["rtdd_tstart"] = 0
blockData["rtdd_tdur"] = 0
blockData["rtdd_tp"] = ""
except Exception:
pass
# ============================================================================
# 五、提示工具
# ============================================================================
def _notifyIfOnline(self, playerId, tip):
if not tip or not playerId:
return
try:
ids = comp.CreateGame(LevelId).GetAllPlayerIds()
if playerId in ids:
comp.CreateMsg(playerId).NotifyOneMessage(playerId, tip)
except Exception:
pass
# ============================================================================
# 六、工具方法:替换方块
# ============================================================================
def replaceBlock(self, pos, dim, newBlockName, playerId=None):
creator = playerId if playerId is not None else LevelId
aux = 0
try:
oldBlock = comp.CreateBlockInfo(creator).GetBlockNew(pos, dim)
aux = oldBlock.get("aux", 0)
except Exception:
aux = 0
comp.CreateBlockInfo(creator).SetBlockNew(
pos, blockDict={"name": newBlockName, "aux": aux},
oldBlockHandling=0, dimensionId=dim)
@@ -0,0 +1 @@
# -*- coding: utf-8 -*-