吃 3 功能

This commit is contained in:
wenhe committed 2026-09-21 16:13:53 +08:00
1 parent 4176eb293c
commit fb817b5d34
12 files changed
+1021 -118

No files matched your search

@@ -26,6 +26,7 @@ from xiangyemod.tangguo.service.TangguoService import TangguoService
from xiangyemod.tangguo.service.TangguoTimerService import TangguoTimerService
from xiangyemod.chaoguo.service.ChaoguoService import ChaoguoService
from xiangyemod.chaoguo.service.ChaoguoTimerService import ChaoguoTimerService
from xiangyemod.shiyongfood.service.ShiyongfoodService import ShiyongfoodService
if not serverApi.IsInServer():
pass
@@ -173,7 +173,7 @@ SWITCH_RULES = [
{"block": "rtdd:dumplings_3", "item": None, "action": "drop_result",
"dropItem": "rtdd:dumplings_4", "tip": "§a捏合成了生饺子"},
{"block": "rtdd:steamerdumplings_1", "item": PLATE, "action": "take_steamer",
"dropItem": "rtdd:plate_30", "consume": 1, "tip": "§a取出盘装水饺, 蒸笼归位"},
"dropItem": "rtdd:plate_30a", "consume": 1, "tip": "§a取出美味饺子(全份)盘装, 蒸笼归位"},
# ---- 三、包子组 ----
{"block": "rtdd:dumplings_0", "item": None, "target": "rtdd:baozipi",
@@ -65,6 +65,8 @@ class FeatureDispatcher(BlueFoxServerSystem):
itemUseOnAll = {} # 物品名 -> [服务...]: 同一物品可被多个服务注册(按注册顺序), 逐个 fallback
timerOwner = {}
timerSet = set()
tryUseOwner = {} # 物品名 -> 服务: 手持"直接吃"物品(长按使用)路由
tryUseSet = set()
# ---- 拆方块掉落映射: 方块名 → 掉落对应的原版生食材 ----
# 玩家左键破坏这些"放置的半成品/死鱼"方块时, 取消默认掉落, 改为掉对应的原版生食材
@@ -109,6 +111,16 @@ class FeatureDispatcher(BlueFoxServerSystem):
cls.timerOwner[block] = service
cls.timerSet.add(block)
@classmethod
def registerTryUse(cls, service):
"""
手持"直接吃"服务初始化时调用:把"手持右键直接吃(不放置)"的物品注册进 try-use
路由表。ServerItemTryUseEvent(长按使用物品) 会按此表把事件路由到对应服务。
"""
for item in service.getTryUseRules():
cls.tryUseOwner[item] = service
cls.tryUseSet.add(item)
@classmethod
def startTimerFor(cls, blockName, dim, pos, playerId=None):
"""
@@ -279,13 +291,19 @@ class FeatureDispatcher(BlueFoxServerSystem):
def OnItemTryUse(self, args):
"""
玩家尝试使用物品(喝药水、吃食物等)时触发。
如果该玩家刚被标记为"取消下一次物品使用"(_cancelItemUse),
就取消这次默认行为,避免右键转换方块时误喝药水。
1. 如果该玩家刚被标记为"取消下一次物品使用"(_cancelItemUse),
就取消这次默认行为,避免右键转换方块时误喝药水。
2. 否则按 tryUseOwner 路由:手持"直接吃"物品(饭团/水煮蛋/豆腐) -> 吃掉。
"""
playerId = args.get("playerId")
print "[FD-ItemTryUse]", args.get("itemName"), "player", playerId
if self._cancelItemUse.pop(playerId, False):
args['cancel'] = True
return
itemName = args.get("itemName")
service = self.tryUseOwner.get(itemName)
if service and service.handleItemTryUse(args):
args['cancel'] = True
# ============================================================================
# 主入口4:计时方块 tick → 按 timerOwner 路由到计时服务(持久化计时)
@@ -0,0 +1,590 @@
# -*- coding: utf-8 -*-
"""
================================================================================
【总食用】(shiyongfood) 食用规则数据
================================================================================
唯一标准: lang(zh_CN.lang) 里的汉语方块/物品名, 不理会英文 id 的含义
规范来源: tuilun/总食用转化关系.txt (2026-09-21, 用户最终稿)
【操作方式】
1. 成品方块吃(绝大多数): 先放置成方块, 再【空手右键 已放置的方块】吃一级
- 规则在 EAT_RULES: block(被吃的方块) -> target(转换成下一级, 缺省=消失)
- hunger = 回复饱食度(点, 1点=半个鸡腿); effects = 增益效果
- drop = 吃完掉落的容器(脏盘子plate_0a/木碗bowlasoup/玻璃杯fruitjuice_0/支杆b_34)
2. 手持物品直接吃(不放置, TRY_USE_RULES): 饭团/水煮蛋/豆腐
- 手持该物品右键(长按/点方块表面), 消耗1个, 回复饱食度+效果, 无容器掉落
【effects 格式】("效果英文名", 时长秒, 等级)
等级 1 = 效果I (AddEffectToEntity 的 amplifier = 等级-1; 夜视/缓降等无等级差也用1)
例: ("strength", 60, 2) = 力量II(60秒)
================================================================================
"""
import mod.server.extraServerApi as serverApi
# ============================================================================
# 一、容器/道具 id
# ============================================================================
PLATE_DIRTY = "rtdd:plate_0a" # 脏盘子
BOWL = "rtdd:bowlasoup" # 木碗
GLASS = "rtdd:fruitjuice_0" # 玻璃杯
ROD = "rtdd:b_34" # 支杆(烧烤烤鱼用)
# ============================================================================
# 二、增益效果中文名(提示用)
# ============================================================================
EFFECT_CN = {
"speed": "速度", "haste": "急迫", "strength": "力量",
"instant_health": "瞬间治疗", "regeneration": "生命恢复",
"resistance": "抗性提升", "fire_resistance": "抗火",
"water_breathing": "水下呼吸", "night_vision": "夜视",
"saturation": "饱和", "absorption": "伤害吸收",
"health_boost": "生命提升", "luck": "幸运",
"jump_boost": "跳跃提升", "slow_falling": "缓降",
"conduit_power": "潮涌能量",
}
# ============================================================================
# 三、成品方块吃(EAT_RULES)
# 字段: block(必), target(可省=消失), hunger(必), effects(可省),
# drop(可省=无容器掉落)
# ============================================================================
EAT_RULES = [
# ------------------------------------------------------------------
# 【炒锅】(xy_chaoguo)
# ------------------------------------------------------------------
# 一、黑椒牛排 全份->半份
{"block": "rtdd:plate_2", "target": "rtdd:plate_2a", "hunger": 4,
"effects": [("strength", 60, 2)]},
{"block": "rtdd:plate_2a", "hunger": 4, "drop": PLATE_DIRTY},
# 二、清炒猪排 全份->半份
{"block": "rtdd:plate_1", "target": "rtdd:plate_1a", "hunger": 4,
"effects": [("haste", 30, 2), ("speed", 20, 1)]},
{"block": "rtdd:plate_1a", "hunger": 3, "drop": PLATE_DIRTY},
# 三、清炒羊肉
{"block": "rtdd:plate_3", "hunger": 7,
"effects": [("health_boost", 45, 2), ("resistance", 60, 1),
("regeneration", 15, 1)], "drop": PLATE_DIRTY},
# 五、胡萝卜鲑鱼 全份->半份
{"block": "rtdd:plate_5", "target": "rtdd:plate_5a", "hunger": 4,
"effects": [("luck", 40, 1), ("water_breathing", 50, 1)]},
{"block": "rtdd:plate_5a", "hunger": 3, "drop": PLATE_DIRTY},
# 六、胡萝卜牛排骨
{"block": "rtdd:plate_6", "hunger": 7,
"effects": [("strength", 45, 1), ("resistance", 30, 1),
("night_vision", 60, 1)], "drop": PLATE_DIRTY},
# 七、黑椒牛腿
{"block": "rtdd:plate_7", "hunger": 8,
"effects": [("strength", 45, 1), ("speed", 30, 2)], "drop": PLATE_DIRTY},
# 八、胡萝卜牛里脊
{"block": "rtdd:plate_8", "hunger": 7,
"effects": [("strength", 45, 1), ("night_vision", 60, 1)],
"drop": PLATE_DIRTY},
# 九、胡萝卜羊腿 全份->半份
{"block": "rtdd:plate_9", "target": "rtdd:plate_9a", "hunger": 4,
"effects": [("jump_boost", 50, 2), ("absorption", 15, 2)]},
{"block": "rtdd:plate_9a", "hunger": 3, "drop": PLATE_DIRTY},
# 十、胡萝卜炒羊里脊 全份->半份
{"block": "rtdd:plate_10", "target": "rtdd:plate_10a", "hunger": 4,
"effects": [("health_boost", 60, 4), ("regeneration", 20, 2)]},
{"block": "rtdd:plate_10a", "hunger": 3, "drop": PLATE_DIRTY},
# 十一、胡萝卜炒羊排
{"block": "rtdd:plate_11", "hunger": 6,
"effects": [("health_boost", 45, 2), ("regeneration", 15, 1),
("night_vision", 40, 1)], "drop": PLATE_DIRTY},
# 十二、小炒五花肉 全份->半份
{"block": "rtdd:plate_12", "target": "rtdd:plate_12a", "hunger": 3,
"effects": [("speed", 45, 1), ("haste", 45, 1), ("strength", 45, 1)]},
{"block": "rtdd:plate_12a", "hunger": 3, "drop": PLATE_DIRTY},
# 十三、胡萝卜炒猪排骨 全份->半份
{"block": "rtdd:plate_13", "target": "rtdd:plate_13a", "hunger": 4,
"effects": [("strength", 45, 1), ("jump_boost", 50, 1),
("absorption", 30, 2)]},
{"block": "rtdd:plate_13a", "hunger": 3, "drop": PLATE_DIRTY},
# 十四、炒土豆
{"block": "rtdd:plate_14", "hunger": 4,
"effects": [("saturation", 15, 1), ("regeneration", 30, 1)],
"drop": PLATE_DIRTY},
# 十五、胡萝卜炒鳕鱼
{"block": "rtdd:plate_15", "hunger": 6,
"effects": [("luck", 60, 1), ("water_breathing", 60, 1)],
"drop": PLATE_DIRTY},
# 十六、辣炒兔肉 全份->半份
{"block": "rtdd:plate_19", "target": "rtdd:plate_19a", "hunger": 4,
"effects": [("fire_resistance", 60, 1), ("resistance", 20, 1),
("jump_boost", 50, 2)]},
{"block": "rtdd:plate_19a", "hunger": 3, "drop": PLATE_DIRTY},
# 十七、元气煎蛋
{"block": "rtdd:plate_22", "hunger": 4,
"effects": [("regeneration", 30, 1), ("luck", 30, 2)],
"drop": PLATE_DIRTY},
# 十八、炒时蔬
{"block": "rtdd:plate_23", "hunger": 4,
"effects": [("speed", 30, 1), ("regeneration", 30, 1)],
"drop": PLATE_DIRTY},
# 十九、炒碎肉
{"block": "rtdd:plate_24", "hunger": 5,
"effects": [("strength", 30, 1), ("absorption", 30, 2)],
"drop": PLATE_DIRTY},
# 二十、煎鲑鱼
{"block": "rtdd:plate_25", "hunger": 6,
"effects": [("luck", 40, 1), ("water_breathing", 40, 1)],
"drop": PLATE_DIRTY},
# 二十一、炒鱿鱼 全份->三分之二->三分之一
{"block": "rtdd:plate_26", "target": "rtdd:plate_26a", "hunger": 4,
"effects": [("conduit_power", 30, 2), ("water_breathing", 60, 1),
("night_vision", 30, 1), ("resistance", 50, 1)]},
{"block": "rtdd:plate_26a", "target": "rtdd:plate_26b", "hunger": 4},
{"block": "rtdd:plate_26b", "hunger": 2, "drop": PLATE_DIRTY},
# 二十二、炒鱿鱼须 全份->半份
{"block": "rtdd:plate_26d", "target": "rtdd:plate_26c", "hunger": 2,
"effects": [("speed", 30, 1), ("water_breathing", 30, 1)]},
{"block": "rtdd:plate_26c", "hunger": 2, "drop": PLATE_DIRTY},
# 二十三、小炒鸡肉 全份->半份
{"block": "rtdd:plate_31", "target": "rtdd:plate_31a", "hunger": 4,
"effects": [("saturation", 30, 1), ("speed", 60, 2), ("haste", 30, 1)]},
{"block": "rtdd:plate_31a", "hunger": 3, "drop": PLATE_DIRTY},
# 二十四、麻婆豆腐 全份->半份
{"block": "rtdd:plate_32", "target": "rtdd:plate_32a", "hunger": 4,
"effects": [("fire_resistance", 45, 1), ("regeneration", 20, 2),
("health_boost", 60, 3)]},
{"block": "rtdd:plate_32a", "hunger": 3, "drop": PLATE_DIRTY},
# 二十五、炒蟹 全份->半份
{"block": "rtdd:plate_33", "target": "rtdd:plate_33a", "hunger": 2,
"effects": [("luck", 60, 1)]},
{"block": "rtdd:plate_33a", "hunger": 3, "drop": PLATE_DIRTY},
# 二十六、辣炒鲑鱼
{"block": "rtdd:plate_41", "hunger": 6,
"effects": [("fire_resistance", 30, 1), ("resistance", 20, 1),
("speed", 50, 1)], "drop": PLATE_DIRTY},
# 二十七、牛肉意面 全份->半份
{"block": "rtdd:plate_43", "target": "rtdd:plate_43a", "hunger": 3,
"effects": [("saturation", 30, 1), ("strength", 30, 2),
("regeneration", 30, 1)]},
{"block": "rtdd:plate_43a", "hunger": 4, "drop": PLATE_DIRTY},
# 二十八、香菇意面 全份->半份
{"block": "rtdd:plate_44", "target": "rtdd:plate_44a", "hunger": 2,
"effects": [("saturation", 45, 1), ("jump_boost", 30, 1),
("haste", 30, 1)]},
{"block": "rtdd:plate_44a", "hunger": 3, "drop": PLATE_DIRTY},
# 二十九、胡萝卜意面 全份->半份
{"block": "rtdd:plate_45", "target": "rtdd:plate_45a", "hunger": 2,
"effects": [("saturation", 25, 1), ("night_vision", 30, 1),
("absorption", 40, 2)]},
{"block": "rtdd:plate_45a", "hunger": 3, "drop": PLATE_DIRTY},
# 三十、鸡肉番茄意面 全份->半份
{"block": "rtdd:plate_46", "target": "rtdd:plate_46a", "hunger": 4,
"effects": [("health_boost", 40, 3), ("regeneration", 15, 1),
("resistance", 20, 1)]},
{"block": "rtdd:plate_46a", "hunger": 3, "drop": PLATE_DIRTY},
# 三十一、辣子鸡丁
{"block": "rtdd:plate_47", "hunger": 6,
"effects": [("fire_resistance", 45, 1), ("strength", 45, 1),
("speed", 30, 1)], "drop": PLATE_DIRTY},
# 三十二、辣椒炒牛肉
{"block": "rtdd:plate_47a", "hunger": 6,
"effects": [("strength", 40, 2), ("resistance", 30, 2)],
"drop": PLATE_DIRTY},
# 三十三、土豆炒猪肉
{"block": "rtdd:plate_52", "hunger": 6,
"effects": [("saturation", 20, 1), ("absorption", 40, 3),
("regeneration", 20, 1)], "drop": PLATE_DIRTY},
# 三十四、胡萝卜炒猪肉
{"block": "rtdd:plate_53", "hunger": 6,
"effects": [("absorption", 40, 3), ("regeneration", 20, 1),
("haste", 30, 1)], "drop": PLATE_DIRTY},
# 三十五、香菇滑鸡
{"block": "rtdd:plate_54", "hunger": 5,
"effects": [("speed", 50, 2), ("jump_boost", 30, 2),
("slow_falling", 90, 1)], "drop": PLATE_DIRTY},
# 三十六、蛋炒饭(碗装)
{"block": "rtdd:bowlofriceegg", "hunger": 7,
"effects": [("luck", 60, 2), ("saturation", 30, 1)], "drop": BOWL},
# 三十七、葱油饼
{"block": "rtdd:scallion_pancake_0", "hunger": 4,
"effects": [("absorption", 35, 2), ("slow_falling", 30, 1)]},
# 三十八、酱香饼
{"block": "rtdd:cookedpancake", "hunger": 5,
"effects": [("saturation", 30, 1), ("resistance", 30, 1)]},
# 盖饭
{"block": "rtdd:plate_48", "target": "rtdd:plate_48a", "hunger": 5,
"effects": [("regeneration", 20, 2), ("health_boost", 60, 4)]},
{"block": "rtdd:plate_48a", "hunger": 4, "drop": PLATE_DIRTY},
{"block": "rtdd:plate_55", "target": "rtdd:plate_55a", "hunger": 5,
"effects": [("jump_boost", 30, 2), ("strength", 60, 1),
("slow_falling", 90, 1)]},
{"block": "rtdd:plate_55a", "hunger": 4, "drop": PLATE_DIRTY},
{"block": "rtdd:plate_56", "hunger": 7,
"effects": [("saturation", 30, 1), ("absorption", 90, 2),
("resistance", 60, 1)], "drop": PLATE_DIRTY},
{"block": "rtdd:plate_50", "hunger": 7,
"effects": [("saturation", 30, 1), ("luck", 90, 1),
("night_vision", 60, 1)], "drop": PLATE_DIRTY},
# ------------------------------------------------------------------
# 【油锅】(xy_youguo)
# ------------------------------------------------------------------
{"block": "rtdd:plate_38", "hunger": 5,
"effects": [("regeneration", 30, 1), ("jump_boost", 30, 1)],
"drop": PLATE_DIRTY},
{"block": "rtdd:plate_36", "hunger": 7,
"effects": [("strength", 45, 1), ("resistance", 45, 1),
("fire_resistance", 45, 1)], "drop": PLATE_DIRTY},
{"block": "rtdd:plate_37", "hunger": 4,
"effects": [("speed", 30, 1), ("absorption", 30, 1)],
"drop": PLATE_DIRTY},
{"block": "rtdd:plate_39", "hunger": 5,
"effects": [("luck", 45, 2), ("conduit_power", 60, 1)],
"drop": PLATE_DIRTY},
# 天妇罗炸虾 整份->半份
{"block": "rtdd:plate_49", "target": "rtdd:plate_49a", "hunger": 3,
"effects": [("speed", 45, 1), ("night_vision", 60, 1),
("resistance", 45, 1)]},
{"block": "rtdd:plate_49a", "hunger": 3, "drop": PLATE_DIRTY},
# 炸饺子
{"block": "rtdd:plate_51", "hunger": 5,
"effects": [("absorption", 60, 2), ("regeneration", 20, 1)],
"drop": PLATE_DIRTY},
# ------------------------------------------------------------------
# 【汤锅】(xy_tangguo)
# ------------------------------------------------------------------
# 一、碗装汤品(单次吃完, 掉木碗)
{"block": "rtdd:bowlacarrotbeefsoup", "hunger": 6, "drop": BOWL,
"effects": [("strength", 45, 1), ("regeneration", 45, 1),
("fire_resistance", 45, 1), ("night_vision", 45, 1)]},
{"block": "rtdd:brownlambsoupwithturnipssoup", "hunger": 6, "drop": BOWL,
"effects": [("resistance", 45, 2), ("night_vision", 45, 1)]},
{"block": "rtdd:bowlacarrotribs", "hunger": 6, "drop": BOWL,
"effects": [("night_vision", 45, 1), ("speed", 45, 1),
("strength", 45, 1)]},
{"block": "rtdd:bowlavegetablebeefsoup", "hunger": 6, "drop": BOWL,
"effects": [("regeneration", 30, 1), ("resistance", 30, 1),
("absorption", 60, 2)]},
{"block": "rtdd:bowlavegetablelambsoup", "hunger": 5, "drop": BOWL,
"effects": [("strength", 45, 1), ("regeneration", 20, 1),
("absorption", 60, 2)]},
{"block": "rtdd:bowlavegetableleanbroth", "hunger": 5, "drop": BOWL,
"effects": [("haste", 45, 1), ("health_boost", 45, 2),
("regeneration", 20, 1)]},
{"block": "rtdd:bowlavegetablesstew", "hunger": 6, "drop": BOWL,
"effects": [("saturation", 30, 1), ("speed", 45, 1)]},
{"block": "rtdd:bowlabeefbonebroth", "hunger": 7, "drop": BOWL,
"effects": [("strength", 45, 2), ("night_vision", 45, 1),
("speed", 45, 1), ("slow_falling", 45, 1)]},
{"block": "rtdd:bowlalambstew", "hunger": 7, "drop": BOWL,
"effects": [("regeneration", 45, 1), ("absorption", 60, 3),
("resistance", 45, 1)]},
{"block": "rtdd:bowla_lambchopsoup", "hunger": 7, "drop": BOWL,
"effects": [("absorption", 60, 3), ("regeneration", 10, 1),
("resistance", 45, 2)]},
{"block": "rtdd:bowlacarrotcodsoup", "hunger": 6, "drop": BOWL,
"effects": [("luck", 45, 2), ("jump_boost", 45, 1)]},
{"block": "rtdd:browncarrotfishsoupsoup", "hunger": 6, "drop": BOWL,
"effects": [("luck", 45, 2), ("speed", 45, 1)]},
{"block": "rtdd:bowlaeggcodsoup", "hunger": 5, "drop": BOWL,
"effects": [("regeneration", 30, 1), ("luck", 45, 1),
("health_boost", 45, 2)]},
{"block": "rtdd:brown_norieggsoup", "hunger": 5, "drop": BOWL,
"effects": [("strength", 30, 1), ("absorption", 60, 2)]},
{"block": "rtdd:bowlatufufish", "hunger": 5, "drop": BOWL,
"effects": [("luck", 45, 1), ("water_breathing", 60, 1),
("night_vision", 60, 1)]},
{"block": "rtdd:bowlofmushroomsoup", "hunger": 7, "drop": BOWL,
"effects": [("speed", 45, 1), ("regeneration", 60, 1),
("fire_resistance", 45, 1), ("jump_boost", 45, 1)]},
{"block": "rtdd:brownpigfootsoup", "hunger": 6, "drop": BOWL,
"effects": [("strength", 45, 1), ("resistance", 30, 1),
("speed", 45, 1), ("haste", 45, 2)]},
{"block": "rtdd:bowla_roujiamo", "hunger": 7, "drop": BOWL,
"effects": [("saturation", 45, 1), ("resistance", 45, 1)]},
{"block": "rtdd:dumplingssoup", "hunger": 6, "drop": BOWL,
"effects": [("saturation", 30, 1), ("absorption", 60, 2),
("regeneration", 20, 1)]},
{"block": "rtdd:brownvegetablefishsoup", "hunger": 5, "drop": BOWL,
"effects": [("luck", 45, 1), ("water_breathing", 120, 1)]},
# 二、美味饺子 全份->半份(盘装, 掉脏盘子)
{"block": "rtdd:plate_30a", "target": "rtdd:plate_30", "hunger": 4,
"effects": [("saturation", 45, 1), ("absorption", 60, 3),
("regeneration", 20, 2)]},
{"block": "rtdd:plate_30", "hunger": 3, "drop": PLATE_DIRTY},
# 三、熟面条(碗装)
{"block": "rtdd:noodle_soup", "hunger": 4, "drop": BOWL,
"effects": [("saturation", 15, 1)]},
# 四、熟米饭(碗装, 三形态)
{"block": "rtdd:bowlofrice", "hunger": 4, "drop": BOWL,
"effects": [("saturation", 30, 1)]},
{"block": "rtdd:bowlofrice_2", "hunger": 4, "drop": BOWL,
"effects": [("saturation", 30, 1)]},
{"block": "rtdd:bowlofrice_3", "hunger": 4, "drop": BOWL,
"effects": [("saturation", 30, 1)]},
# 八、汤面(碗装, 单次吃完, 掉木碗)
{"block": "rtdd:noodlesoup_1", "hunger": 7, "drop": BOWL,
"effects": [("health_boost", 45, 2), ("regeneration", 10, 1)]},
{"block": "rtdd:noodlesoup_2", "hunger": 7, "drop": BOWL,
"effects": [("health_boost", 45, 2), ("regeneration", 10, 1)]},
{"block": "rtdd:noodlesoup_3", "hunger": 8, "drop": BOWL,
"effects": [("strength", 60, 2)]},
{"block": "rtdd:noodlesoup_4", "hunger": 7, "drop": BOWL,
"effects": [("regeneration", 60, 1), ("jump_boost", 60, 1)]},
{"block": "rtdd:assortedramen", "hunger": 6, "drop": BOWL,
"effects": [("saturation", 30, 1), ("night_vision", 30, 1)]},
{"block": "rtdd:braisednoodles", "hunger": 7, "drop": BOWL,
"effects": [("strength", 45, 1), ("night_vision", 60, 1)]},
{"block": "rtdd:mushroomnoodles", "hunger": 6, "drop": BOWL,
"effects": [("regeneration", 30, 1), ("haste", 30, 1),
("slow_falling", 30, 1)]},
{"block": "rtdd:yushengramen", "hunger": 6, "drop": BOWL,
"effects": [("luck", 45, 1), ("resistance", 30, 1),
("regeneration", 30, 1)]},
{"block": "rtdd:vegetable_noodles", "hunger": 5, "drop": BOWL,
"effects": [("saturation", 30, 1), ("resistance", 30, 1)]},
{"block": "rtdd:noodles_1", "hunger": 5, "drop": BOWL,
"effects": [("regeneration", 30, 1)]},
{"block": "rtdd:noodles_2", "hunger": 5, "drop": BOWL,
"effects": [("speed", 30, 1)]},
{"block": "rtdd:egg_noodles", "hunger": 6, "drop": BOWL,
"effects": [("health_boost", 30, 1)]},
{"block": "rtdd:tonkotsu_ramen", "hunger": 9, "drop": BOWL,
"effects": [("health_boost", 120, 4), ("regeneration", 30, 2),
("speed", 30, 1)]},
# ------------------------------------------------------------------
# 【面食.甜食】(xy_mianshi)
# ------------------------------------------------------------------
# 熟肉包子 分食链: 整->半个->1/4个->消失
{"block": "rtdd:shouroubao", "target": "rtdd:shoubaozi_2", "hunger": 1,
"effects": [("regeneration", 30, 1)]},
{"block": "rtdd:shoubaozi_2", "target": "rtdd:shoubaozi_3", "hunger": 1},
{"block": "rtdd:shoubaozi_3", "hunger": 1},
# 肉夹馍
{"block": "rtdd:roujiamo_2", "hunger": 6,
"effects": [("strength", 45, 1), ("absorption", 45, 2)]},
# 煎饼卷牛肉
{"block": "rtdd:cookeddought_6", "hunger": 6,
"effects": [("strength", 45, 1), ("absorption", 45, 2)]},
# 煎饼卷鳕鱼
{"block": "rtdd:cookedcoddought_6", "hunger": 6,
"effects": [("luck", 45, 1), ("strength", 45, 1)]},
# 熟竹筒饭
{"block": "rtdd:bamboo_5", "hunger": 4,
"effects": [("saturation", 45, 1), ("resistance", 45, 2)]},
# 法棍(一份)/吐司(一份)/可颂(一份)
{"block": "rtdd:bread_1", "hunger": 3,
"effects": [("strength", 45, 1), ("speed", 45, 1),
("jump_boost", 45, 1)]},
{"block": "rtdd:bread_2", "hunger": 3,
"effects": [("strength", 45, 1), ("speed", 45, 1),
("jump_boost", 45, 1)]},
{"block": "rtdd:bread_3", "hunger": 3,
"effects": [("strength", 45, 1), ("speed", 45, 1),
("jump_boost", 45, 1)]},
# 甜甜圈(一份)
{"block": "rtdd:bread_4", "hunger": 3,
"effects": [("speed", 45, 1), ("resistance", 45, 1)]},
# 蛋糕小块(蜂蜜cake_1d/浆果cake_2d/巧克力cake_3d) + 奶油蛋糕整块(cake_0)
{"block": "rtdd:cake_0", "hunger": 3,
"effects": [("saturation", 45, 1), ("haste", 45, 1),
("absorption", 45, 1)]},
{"block": "rtdd:cake_1d", "hunger": 3,
"effects": [("saturation", 45, 1), ("haste", 45, 1),
("absorption", 45, 1)]},
{"block": "rtdd:cake_2d", "hunger": 3,
"effects": [("saturation", 45, 1), ("haste", 45, 1),
("absorption", 45, 1)]},
{"block": "rtdd:cake_3d", "hunger": 3,
"effects": [("saturation", 45, 1), ("haste", 45, 1),
("absorption", 45, 1)]},
# 焦糖布丁
{"block": "rtdd:cream_caramel", "hunger": 4,
"effects": [("saturation", 30, 1), ("luck", 30, 1)]},
# 舒芙蕾
{"block": "rtdd:souffle_0", "hunger": 4,
"effects": [("saturation", 30, 1), ("health_boost", 30, 1),
("luck", 30, 1)]},
# 馍
{"block": "rtdd:roujiamo_0", "hunger": 2},
# 煎饼
{"block": "rtdd:cooked_dought", "hunger": 4,
"effects": [("regeneration", 10, 1)]},
# ------------------------------------------------------------------
# 【寿司】(xy_sushi)
# ------------------------------------------------------------------
# 鳕鱼寿司块 三->两->一->空
{"block": "rtdd:codsushi_6", "target": "rtdd:codsushicubes_2", "hunger": 2,
"effects": [("luck", 30, 1), ("haste", 30, 1)]},
{"block": "rtdd:codsushicubes_2", "target": "rtdd:codsushicubes_1",
"hunger": 2, "effects": [("luck", 30, 1), ("haste", 30, 1)]},
{"block": "rtdd:codsushicubes_1", "hunger": 2,
"effects": [("luck", 30, 1), ("haste", 30, 1)]},
# 鲑鱼寿司块
{"block": "rtdd:salmonsushi_6", "target": "rtdd:salmonsushicubes_2",
"hunger": 2, "effects": [("luck", 120, 1), ("haste", 60, 1)]},
{"block": "rtdd:salmonsushicubes_2", "target": "rtdd:salmonsushicubes_1",
"hunger": 2, "effects": [("luck", 120, 1), ("haste", 60, 1)]},
{"block": "rtdd:salmonsushicubes_1", "hunger": 2,
"effects": [("luck", 120, 1), ("haste", 60, 1)]},
# 热带鱼寿司块
{"block": "rtdd:fishmonsushi_6", "target": "rtdd:fishsushicubes_2",
"hunger": 2, "effects": [("luck", 120, 1), ("haste", 60, 1)]},
{"block": "rtdd:fishsushicubes_2", "target": "rtdd:fishsushicubes_1",
"hunger": 2, "effects": [("luck", 120, 1), ("haste", 60, 1)]},
{"block": "rtdd:fishsushicubes_1", "hunger": 2,
"effects": [("luck", 120, 1), ("haste", 60, 1)]},
# 手握鳕鱼寿司
{"block": "rtdd:nigirisushicod_3", "target": "rtdd:nigirisushicod_2",
"hunger": 2, "effects": [("health_boost", 30, 1),
("regeneration", 10, 1)]},
{"block": "rtdd:nigirisushicod_2", "target": "rtdd:nigirisushifishcod",
"hunger": 2, "effects": [("health_boost", 30, 1),
("regeneration", 10, 1)]},
{"block": "rtdd:nigirisushifishcod", "hunger": 2,
"effects": [("health_boost", 30, 1), ("regeneration", 10, 1)]},
# 手握鲑鱼寿司
{"block": "rtdd:nigirisushisalnom_3", "target": "rtdd:nigirisushisalnom_2",
"hunger": 2, "effects": [("health_boost", 30, 1),
("regeneration", 10, 1)]},
{"block": "rtdd:nigirisushisalnom_2", "target": "rtdd:nigirisushifishsalmon_1",
"hunger": 2, "effects": [("health_boost", 30, 1),
("regeneration", 10, 1)]},
{"block": "rtdd:nigirisushifishsalmon_1", "hunger": 2,
"effects": [("health_boost", 30, 1), ("regeneration", 10, 1)]},
# 手握热带鱼寿司
{"block": "rtdd:nigirisushifish_3", "target": "rtdd:nigirisushifish_2",
"hunger": 2, "effects": [("health_boost", 30, 1),
("regeneration", 10, 1)]},
{"block": "rtdd:nigirisushifish_2", "target": "rtdd:nigirisushifish_1",
"hunger": 2, "effects": [("health_boost", 30, 1),
("regeneration", 10, 1)]},
{"block": "rtdd:nigirisushifish_1", "hunger": 2,
"effects": [("health_boost", 30, 1), ("regeneration", 10, 1)]},
# 手握鱿鱼寿司
{"block": "rtdd:squidsushi_3", "target": "rtdd:squidsushi_2", "hunger": 2,
"effects": [("health_boost", 30, 1), ("regeneration", 10, 1)]},
{"block": "rtdd:squidsushi_2", "target": "rtdd:squid_sushi", "hunger": 2,
"effects": [("health_boost", 30, 1), ("regeneration", 10, 1)]},
{"block": "rtdd:squid_sushi", "hunger": 2,
"effects": [("health_boost", 30, 1), ("regeneration", 10, 1)]},
# 盘装寿司(单次吃完, 掉脏盘子)
{"block": "rtdd:plate_27", "hunger": 8, "drop": PLATE_DIRTY,
"effects": [("luck", 60, 2), ("health_boost", 60, 3),
("regeneration", 20, 2), ("strength", 60, 1)]},
{"block": "rtdd:plate_28", "hunger": 8, "drop": PLATE_DIRTY,
"effects": [("luck", 60, 2), ("health_boost", 60, 3),
("regeneration", 20, 2), ("strength", 60, 1)]},
{"block": "rtdd:plate_29", "hunger": 8, "drop": PLATE_DIRTY,
"effects": [("luck", 60, 2), ("health_boost", 60, 3),
("regeneration", 20, 2), ("strength", 60, 1)]},
{"block": "rtdd:plate_42", "hunger": 8, "drop": PLATE_DIRTY,
"effects": [("luck", 60, 2), ("health_boost", 60, 3),
("regeneration", 20, 2), ("strength", 60, 1)]},
# ------------------------------------------------------------------
# 【烧烤】(xy_shaokao)
# ------------------------------------------------------------------
# 烤鸡 分食链(无容器)
{"block": "rtdd:roast_chickenplace_1", "target": "rtdd:roast_chickenplace_2",
"hunger": 3, "effects": [("health_boost", 30, 3),
("regeneration", 30, 1)]},
{"block": "rtdd:roast_chickenplace_2", "target": "rtdd:roast_chickenplace_3",
"hunger": 3},
{"block": "rtdd:roast_chickenplace_3", "target": "rtdd:roast_chickenplace_4",
"hunger": 3},
{"block": "rtdd:roast_chickenplace_4", "hunger": 3,
"effects": [("speed", 60, 1)]},
# 烤乳猪 分食链(无容器)
{"block": "rtdd:roastpignew_1", "target": "rtdd:roastpignew_2", "hunger": 4,
"effects": [("health_boost", 30, 3), ("regeneration", 30, 1),
("strength", 30, 1)]},
{"block": "rtdd:roastpignew_2", "target": "rtdd:roastpignew_3", "hunger": 4},
{"block": "rtdd:roastpignew_3", "target": "rtdd:roastpignew_4", "hunger": 4},
{"block": "rtdd:roastpignew_4", "target": "rtdd:roastpignew_5", "hunger": 4},
{"block": "rtdd:roastpignew_5", "target": "rtdd:roastpignew_6", "hunger": 4},
{"block": "rtdd:roastpignew_6", "hunger": 4,
"effects": [("strength", 60, 2)]},
# 烤鳕鱼(熟)/烤鲑鱼(熟): 吃完掉支杆
{"block": "rtdd:grilledcod_1", "hunger": 5, "drop": ROD,
"effects": [("luck", 40, 1)]},
{"block": "rtdd:grilled_salmon", "hunger": 5, "drop": ROD,
"effects": [("luck", 40, 1)]},
# 烤串(熟, 无容器)
{"block": "rtdd:beefkebabs_3", "hunger": 5,
"effects": [("strength", 30, 1)]},
{"block": "rtdd:lambkebabs_3", "hunger": 5,
"effects": [("strength", 30, 1)]},
{"block": "rtdd:roasted_vegetables_3", "hunger": 4,
"effects": [("saturation", 15, 1)]},
{"block": "rtdd:roastedmushrooms_3", "hunger": 4,
"effects": [("regeneration", 15, 1)]},
# ------------------------------------------------------------------
# 【乡野食物】(xy_food)
# ------------------------------------------------------------------
# 章鱼小丸子 完整->半份
{"block": "rtdd:plate_40", "target": "rtdd:plate_40a", "hunger": 4,
"effects": [("regeneration", 60, 1), ("resistance", 60, 1)]},
{"block": "rtdd:plate_40a", "hunger": 2, "drop": PLATE_DIRTY},
# 原版食物-成品盘(单次吃完, 掉脏盘子)
{"block": "rtdd:plate_16", "hunger": 5, "drop": PLATE_DIRTY},
{"block": "rtdd:plate_17", "hunger": 4, "drop": PLATE_DIRTY},
{"block": "rtdd:plate_18", "hunger": 3, "drop": PLATE_DIRTY},
{"block": "rtdd:plate_20", "hunger": 5, "drop": PLATE_DIRTY},
{"block": "rtdd:plate_21", "hunger": 3, "drop": PLATE_DIRTY},
{"block": "rtdd:plate_4", "hunger": 5, "drop": PLATE_DIRTY},
# ------------------------------------------------------------------
# 【乡野饮料】(xy_drink)
# ------------------------------------------------------------------
# 果汁/豆浆(喝完掉玻璃杯)
{"block": "rtdd:fruitjuice_1", "hunger": 2, "drop": GLASS,
"effects": [("speed", 30, 1)]},
{"block": "rtdd:fruitjuice_2", "hunger": 2, "drop": GLASS,
"effects": [("speed", 30, 1)]},
{"block": "rtdd:fruitjuice_3", "hunger": 2, "drop": GLASS,
"effects": [("regeneration", 15, 1)]},
{"block": "rtdd:fruitjuice_4", "hunger": 2, "drop": GLASS,
"effects": [("regeneration", 15, 1)]},
{"block": "rtdd:fruitjuice_6", "hunger": 2, "drop": GLASS,
"effects": [("regeneration", 15, 1)]},
{"block": "rtdd:fruitjuice_7", "hunger": 4, "drop": GLASS,
"effects": [("health_boost", 30, 1)]},
# 冰棍(无容器)
{"block": "rtdd:apple_popsicleplace", "hunger": 2,
"effects": [("speed", 15, 1)]},
{"block": "rtdd:grape_popsicleplace", "hunger": 2,
"effects": [("speed", 15, 1)]},
{"block": "rtdd:melon_popsicleplace", "hunger": 2,
"effects": [("speed", 15, 1)]},
{"block": "rtdd:orange_popsicle_place", "hunger": 2,
"effects": [("speed", 15, 1)]},
{"block": "rtdd:peach_popsicleplace", "hunger": 2,
"effects": [("speed", 15, 1)]},
# 冰沙(无容器)
{"block": "rtdd:appleicecreamplace", "hunger": 3,
"effects": [("speed", 30, 1)]},
{"block": "rtdd:grapeicecreamplace", "hunger": 3,
"effects": [("speed", 30, 1)]},
{"block": "rtdd:orangeicecreamplace", "hunger": 3,
"effects": [("speed", 30, 1)]},
{"block": "rtdd:peachicecreamplace", "hunger": 3,
"effects": [("speed", 30, 1)]},
{"block": "rtdd:melonicecreamplace", "hunger": 3,
"effects": [("speed", 30, 1)]},
]
# ============================================================================
# 四、手持物品右键直接吃(不放置)
# itemName -> {hunger, effects} 消耗1个, 无容器掉落
# ============================================================================
TRY_USE_RULES = {
"rtdd:rice_balls": {"hunger": 3, "effects": [("saturation", 15, 1)]},
"rtdd:boiled_egg": {"hunger": 2, "effects": []},
"rtdd:beancurd": {"hunger": 2, "effects": []},
}
# ============================================================================
# 五、把规则表索引为字典: block -> rule
# ============================================================================
EAT_RULE_MAP = {}
for _r in EAT_RULES:
EAT_RULE_MAP[_r["block"]] = _r
@@ -0,0 +1 @@
# -*- coding: utf-8 -*-
@@ -0,0 +1,218 @@
# -*- coding: utf-8 -*-
"""
================================================================================
【总食用】(shiyongfood) 服务 —— 所有成品的"吃"
================================================================================
【入口(由 FeatureDispatcher 统一转发)】
1. handleBlockUse 空手右键 已放置的成品方块 -> 吃一级
- 有 target: 方块转换成下一级(半份/下一份)
- 无 target: 方块完全消耗(消失) + 掉落容器(脏盘子/木碗/玻璃杯/支杆)
2. handleItemUseOn 手持 饭团/水煮蛋/豆腐 右键方块表面 -> 直接吃(消耗1个)
3. handleItemTryUse 手持 饭团/水煮蛋/豆腐 长按右键(空中使用) -> 直接吃(消耗1个)
【数值】
- 饱食度: SetPlayerHunger(0~20), 1点 = 半个鸡腿(原版饥饿值)
- 效果: AddEffectToEntity(effectName, 时长秒, amplifier)
amplifier = 等级-1 (效果I=0, 效果II=1, ...)
- 冷却: 0.4 秒(防长按右键连吃刷屏)
================================================================================
"""
import time
import mod.server.extraServerApi as serverApi
ServerSystem = serverApi.GetServerSystemCls() # 服务端系统基类
comp = serverApi.GetEngineCompFactory() # 组件工厂
from ...BlueFoxTools.SpecialFunciton.BlueFoxSystem import BlueFoxServerSystem
from ...BlueFoxTools.ToolsConfig import LevelId
from ..ShiyongfoodData import EAT_RULE_MAP, TRY_USE_RULES, EFFECT_CN
class ShiyongfoodService(BlueFoxServerSystem):
"""总食用服务: 所有成品右键吃(方块吃 + 手持物品直接吃)"""
def __init__(self, namespace, systemName):
BlueFoxServerSystem.__init__(self, namespace, systemName)
self.eatBlocks = set(EAT_RULE_MAP.keys()) # 可吃的成品方块
self.tryUseItems = set(TRY_USE_RULES.keys()) # 手持直接吃的物品
self.cooldown = {} # 右键冷却
# ---- 注册到统一分发器: 右键方块 + 手持右键表面 + 手持直接吃 ----
from ...service.FeatureDispatcher import FeatureDispatcher
FeatureDispatcher.register(self)
FeatureDispatcher.registerTryUse(self)
# ------------------------------------------------------------------
# 分发器路由表(FeatureDispatcher 调用)
# ------------------------------------------------------------------
def getFeatureBlocks(self):
"""成品方块(空手右键吃)"""
return self.eatBlocks
def getItemUseOnRules(self):
"""手持吃物品也注册进"右键方块表面"路由(点方块表面直接吃)"""
return {item: True for item in self.tryUseItems}
def getTryUseRules(self):
"""手持直接吃(长按右键/空中使用)"""
return {item: True for item in self.tryUseItems}
# ====================================================================
# 入口1: 空手右键 已放置的成品方块 -> 吃一级
# ====================================================================
def handleBlockUse(self, args):
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 and itemName != "minecraft:air":
return False
rule = EAT_RULE_MAP.get(blockName)
if not rule:
return False
if not self.checkCooldown(key, 0.4):
return True
self._applyFood(playerId, rule.get("hunger", 0), rule.get("effects", []))
target = rule.get("target")
if target:
# 方块转换成下一级(半份/下一份)
self._replaceBlock(playerId, pos, dim, target)
else:
# 完全消耗消失 + 掉落容器
self._clearBlock(playerId, pos, dim)
drop = rule.get("drop")
if drop:
self.dropItem(dim, pos, drop)
self._notify(playerId, rule)
return True
# ====================================================================
# 入口2: 手持 饭团/水煮蛋/豆腐 右键方块表面 -> 直接吃
# ====================================================================
def handleItemUseOn(self, args):
itemName = args.get("itemName")
rule = TRY_USE_RULES.get(itemName)
if not rule:
return False
playerId = args.get("playerId") or args.get("entityId")
return self._eatItemInHand(playerId, itemName, rule)
# ====================================================================
# 入口3: 手持 饭团/水煮蛋/豆腐 长按右键(空中使用) -> 直接吃
# ====================================================================
def handleItemTryUse(self, args):
itemName = args.get("itemName")
rule = TRY_USE_RULES.get(itemName)
if not rule:
return False
playerId = args.get("playerId") or args.get("entityId")
return self._eatItemInHand(playerId, itemName, rule)
# ------------------------------------------------------------------
# 手持吃公共: 消耗1个 + 回复饱食度 + 效果(无容器掉落)
# ------------------------------------------------------------------
def _eatItemInHand(self, playerId, itemName, rule):
if not playerId:
return False
if not self.checkCooldown(("p", playerId), 0.4):
return True
itemDict = self.getCarriedItem(playerId)
if not itemDict or itemDict.get("newItemName") != itemName:
return False
count = itemDict.get("count", 1)
comp.CreateItem(playerId).SetEntityItem(
serverApi.GetMinecraftEnum().ItemPosType.CARRIED,
{"itemName": itemName,
"count": max(count - 1, 0),
"auxValue": itemDict.get("newAuxValue", 0),
"userData": itemDict.get("userData", {})})
self._applyFood(playerId, rule.get("hunger", 0), rule.get("effects", []))
self._notify(playerId, rule)
return True
# ====================================================================
# 工具: 回复饱食度 + 增益效果
# ====================================================================
def _applyFood(self, playerId, hunger, effects):
try:
# 饱食度【在现有值上累加】(不是覆盖): 当前值 + 回复值, 上限20点
attrComp = comp.CreateAttr(playerId)
cur = attrComp.GetPlayerHunger()
if cur is None:
cur = 0
newVal = max(0.0, min(float(cur) + float(hunger), 20.0))
attrComp.SetPlayerHunger(newVal)
except Exception:
pass
if effects:
try:
effectComp = comp.CreateEffect(LevelId)
for name, dur, lvl in effects:
# 效果I -> amplifier 0, 效果II -> amplifier 1 ...
effectComp.AddEffectToEntity(playerId, name, dur, lvl - 1, False)
except Exception:
pass
# ====================================================================
# 工具: 替换/清除方块
# ====================================================================
def _replaceBlock(self, creator, pos, dim, blockName):
comp.CreateBlockInfo(creator).SetBlockNew(
pos, blockDict={"name": blockName, "aux": 0},
oldBlockHandling=0, dimensionId=dim)
def _clearBlock(self, creator, pos, dim):
comp.CreateBlockInfo(creator).SetBlockNew(
pos, blockDict={"name": "minecraft:air", "aux": 0},
oldBlockHandling=0, dimensionId=dim)
# ====================================================================
# 工具: 以掉落物形式生成物品(出现在方块上方)
# ====================================================================
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
# ====================================================================
# 工具: 食用提示
# ====================================================================
def _notify(self, playerId, rule):
try:
hunger = rule.get("hunger", 0)
msg = "\u00a7a回复 %d 点饱食度" % hunger
effects = rule.get("effects", [])
if effects:
parts = []
for name, dur, lvl in effects:
cn = EFFECT_CN.get(name, name)
parts.append("%s%s(%d秒)" % (cn, self._roman(lvl), dur))
msg += ", 获得 " + " ".join(parts)
comp.CreateMsg(playerId).NotifyOneMessage(playerId, msg)
except Exception:
pass
@staticmethod
def _roman(lvl):
return {1: "I", 2: "II", 3: "III", 4: "IV", 5: "V"}.get(lvl, "")
# ====================================================================
# 工具: 冷却检查(0.4秒, 防长按右键连吃)
# ====================================================================
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 @@
# -*- coding: utf-8 -*-