市场贸易实现 bug修复

This commit is contained in:
wenhe committed 2026-09-03 14:09:44 +08:00
1 parent 1f329f8b4c
commit cae9bcb19e
25 files changed
+1300 -187

No files matched your search

@@ -17,14 +17,13 @@
【事件监听在哪?】
本类【不】监听任何事件!
所有事件由 FeatureDispatcher(xiangyemod/service/FeatureDispatcher.py)统一监听:
- ServerBlockUseEvent → OnBlockUse → 按 blockOwner 路由到本类 handleBlockUse
- ServerItemUseOnEvent → OnItemUseOn → 按 itemUseOnOwner 路由到本类 handleItemUseOn
- ServerBlockUseEvent → OnBlockUse → 按 blockOwner 路由到本类 handleBlockUse
- ServerBlockEntityTickEvent → OnBlockEntityTick → 按 timerOwner 路由到 BarbecueTimerService
本类只实现被分发器调用的接口方法,不关心事件来源。
注: 原版生鸡肉右键放置"生鸡肉(放置后)"已拆到 yuanbanfangzhi/YuanbanService。
【本类怎么做(自上而下的方法系列)】
handleBlockUse ← 入口1:分发器转发右键方块事件
handleItemUseOn ← 入口2:分发器转发"手持物品右键方块表面"事件(放置生鸡肉)
handleBlockUse ← 入口:分发器转发右键方块事件
├─ findRecipe ← 匹配 (方块名, 物品名) 规则
├─ checkCooldown ← 连点冷却(防刷提示)
├─ forwardStartTimer ← 计时源方块 → 转发给计时服务启动烤制
@@ -48,21 +47,11 @@ from ....BlueFoxTools.SpecialFunciton.BlueFoxSystem import BlueFoxServerSystem
from ....BlueFoxTools.ToolsConfig import LevelId
# ---- 只导入烧烤自己的数据库 ----
from ..BarbecueData import BARBECUE_SWITCHES, ITEM_USE_ON_RULES
from ..BarbecueData import BARBECUE_SWITCHES
# ---- 统一分发器 ----
from ...service.FeatureDispatcher import FeatureDispatcher
# ---- 方块表面方向 → 相邻坐标偏移(0下 1上 2北 3南 4西 5东) ----
FACE_OFFSET = {
0: (0, -1, 0),
1: (0, 1, 0),
2: (0, 0, -1),
3: (0, 0, 1),
4: (-1, 0, 0),
5: (1, 0, 0),
}
class BarbecueService(BlueFoxServerSystem):
"""
@@ -71,8 +60,11 @@ class BarbecueService(BlueFoxServerSystem):
【核心数据结构】
barbecueRecipes = {(方块名, 物品名): 规则dict} # O(1) 查找,含 switch+timer 规则
barbecueBlockSet = {方块名, ...} # O(1) 拦截/注册用(所有源方块)
itemUseOnRecipes = {物品名: 规则dict} # 手持物品右键方块表面 → 生成规则
cooldown = {key: 时间戳} # 连点冷却表
【原版放置已拆出】
手持原版生鸡肉右键方块表面放置"生鸡肉(放置后)"的 ItemUseOn 逻辑
已拆到 xiangyemod/yuanbanfangzhi/YuanbanService。
"""
def __init__(self, namespace, systemName):
@@ -91,11 +83,6 @@ class BarbecueService(BlueFoxServerSystem):
self.barbecueRecipes[key] = sw
self.barbecueBlockSet.add(sw["source"])
# ---- 手持物品右键方块表面规则:物品名 → 规则 ----
self.itemUseOnRecipes = {}
for rule in ITEM_USE_ON_RULES:
self.itemUseOnRecipes[rule["item"]] = rule
# ---- 右键冷却表 ----
self.cooldown = {}
@@ -111,8 +98,8 @@ class BarbecueService(BlueFoxServerSystem):
return self.barbecueBlockSet
def getItemUseOnRules(self):
"""返回手持物品右键方块表面的规则:{物品名: 规则dict}(供分发器路由)"""
return self.itemUseOnRecipes
"""返回"手持物品右键方块表面"的规则(原版放置已拆到 yuanbanfangzhi, 返回空)"""
return {}
def handleBlockUse(self, args):
"""
@@ -153,48 +140,6 @@ class BarbecueService(BlueFoxServerSystem):
self.handleSwitch(recipe, playerId, pos, dim, itemDict, key)
return True
def handleItemUseOn(self, args):
"""
由 FeatureDispatcher 转发的"手持物品右键方块表面"事件。
当前用于:手持原版生鸡肉右键任意方块表面 → 在其表面生成生鸡肉(放置后)方块。
返回 True=已处理,False=当前组合无匹配规则。
"""
itemName = args.get("itemName")
# ServerItemUseOnEvent 的玩家键是 entityId,不是 playerId
playerId = args.get("playerId") or args.get("entityId")
rule = self.itemUseOnRecipes.get(itemName)
if not rule:
return False
x, y, z = args.get("x"), args.get("y"), args.get("z")
face = args.get("face", 1)
dim = comp.CreateDimension(playerId).GetEntityDimensionId()
# 计算被点方块表面相邻的目标格
off = FACE_OFFSET.get(face, (0, 1, 0))
targetPos = (x + off[0], y + off[1], z + off[2])
# 目标格必须为空(可放置)
try:
cur = comp.CreateBlockInfo(LevelId).GetBlockNew(targetPos, dim)
if cur and cur.get("name") != "minecraft:air":
return False
except Exception:
return False
# 消耗 1 个生鸡肉
itemDict = self.getCarriedItem(playerId)
if not itemDict:
return False
self.consumeItem(playerId, itemDict, rule.get("consume", 1))
# 生成生鸡肉(放置后)方块
self.replaceBlock(targetPos, dim, rule["target"], playerId)
# 放置成功提示
if rule.get("tip"):
comp.CreateMsg(playerId).NotifyOneMessage(playerId, rule["tip"])
return True
# ============================================================================
# 二、规则匹配(O(1) 字典查找)
# ============================================================================