烧烤 动物养殖 分类 转换功能 计时转换 退出重新判断tick (可用版本)
This commit is contained in:
1 parent
6686e80d22
commit
f359008ac3
6 files changed
+136
-87
No files matched your search
+19
@@ -58,6 +58,22 @@ blockEntityDataComp = comp.CreateBlockEntityData(LevelId)
|
||||
# RECIPES 是一个列表,每条配方是一个 dict,格式见 RecipeData.py 顶部注释
|
||||
from ..RecipeData import RECIPES, inferBaseBlock, BELOW_CAMPFIRE
|
||||
|
||||
# ---- 已由 FeatureDispatcher/BarbecueService 接管的烧烤方块 ----
|
||||
# 这些方块属于"烧烤"(xy_barbecue) 分类,由新系统处理(支杆+营火机制),
|
||||
# 做菜系统必须跳过,否则右键烤乳猪(熟)等会被当成菜谱去查灶台底座,弹出错误提示。
|
||||
_BARBECUE_OWNED = set([
|
||||
"rtdd:barbecuegrill_0", "rtdd:barbecuegrill_1",
|
||||
"rtdd:roastpig_0", "rtdd:roastpig_1",
|
||||
"rtdd:roastchicken_0", "rtdd:roastchicken_1",
|
||||
"rtdd:roastchickenplace_0",
|
||||
"rtdd:grilledcod_0", "rtdd:grilledcod_1",
|
||||
"rtdd:grilled_fish", "rtdd:grilled_salmon",
|
||||
"rtdd:roasted_vegetables_0", "rtdd:roasted_vegetables_1", "rtdd:roasted_vegetables_3",
|
||||
"rtdd:roastedmushrooms_0", "rtdd:roastedmushrooms_1", "rtdd:roastedmushrooms_3",
|
||||
"rtdd:beefkebabs_0", "rtdd:beefkebabs_1", "rtdd:beefkebabs_3",
|
||||
"rtdd:lambkebabs_0", "rtdd:lambkebabs_1", "rtdd:lambkebabs_3",
|
||||
])
|
||||
|
||||
# ================================================================================
|
||||
# 工具函数:读取物品 userData 里的嵌套字段
|
||||
# ================================================================================
|
||||
@@ -141,8 +157,11 @@ class CookingService(BlueFoxServerSystem):
|
||||
# ---- 构建做菜方块名集合(O(1) 快速拦截,第一道过滤) ----
|
||||
# 事件进来先判断方块名在不在这个集合里,不在直接 return,
|
||||
# 这样工具方块的右键事件根本不会进到本系统的字典查找
|
||||
# 注意:跳过已由 BarbecueService 接管的烧烤方块,避免做菜系统抢事件
|
||||
self.cookBlockSet = set()
|
||||
for recipe in RECIPES:
|
||||
if recipe["source"] in _BARBECUE_OWNED:
|
||||
continue
|
||||
self.cookBlockSet.add(recipe["source"])
|
||||
|
||||
def Destroy(self):
|
||||
|
||||
+11
-16
@@ -201,28 +201,23 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
|
||||
def OnBlockEntityTick(self, args):
|
||||
"""
|
||||
配置了 tick:true 的方块每帧触发。
|
||||
配置了 tick:true 的方块每帧触发(官方频率约每秒20次)。
|
||||
用于"烤制/饲料变空"等计时转换的持久化:
|
||||
- 转换开始时把 开始时间戳+时长 写进方块实体数据
|
||||
- 服务器重启/玩家重进后,tick 恢复,读回时间戳继续计时,
|
||||
到点即转换(例如烤鸡烤了40秒退出,回来只剩20秒)
|
||||
按方块实体数据里的计时标识 rtdd_tid 路由到对应功能服务。
|
||||
|
||||
注意:该事件参数是 blockName/dimension/posX/posY/posZ(不是 posDim!)
|
||||
直接用事件自带的 blockName 路由,省掉每帧读方块,性能更好。
|
||||
"""
|
||||
posDim = args.get("posDim")
|
||||
if not posDim:
|
||||
posX = args.get("posX")
|
||||
posY = args.get("posY")
|
||||
posZ = args.get("posZ")
|
||||
dimension = args.get("dimension")
|
||||
if posX is None or posY is None or posZ is None or dimension is None:
|
||||
return
|
||||
dim = posDim[3]
|
||||
pos = (posDim[0], posDim[1], posDim[2])
|
||||
try:
|
||||
data = blockEntityDataComp.GetBlockEntityData(dim, pos)
|
||||
if not data:
|
||||
return
|
||||
tid = data.get("rtdd_tid") # 计时标识 = 计时源方块名
|
||||
except Exception:
|
||||
return
|
||||
if not tid:
|
||||
return
|
||||
service = self.blockOwner.get(tid) # 计时源方块一定注册在路由表里
|
||||
blockName = args.get("blockName", "")
|
||||
service = self.blockOwner.get(blockName) # 计时源方块一定注册在路由表里
|
||||
if not service:
|
||||
return
|
||||
service.handleBlockEntityTick(args)
|
||||
Reference in new issue
Block a user