市场贸易实现 bug修复
This commit is contained in:
1 parent
1f329f8b4c
commit
cae9bcb19e
25 files changed
+1300
-187
No files matched your search
+3
-11
@@ -311,14 +311,6 @@ BARBECUE_SWITCHES = [
|
||||
# ============================================================
|
||||
# 六、手持物品右键"方块表面"生成规则(ServerItemUseOnEvent)
|
||||
# ============================================================
|
||||
# 目前只有一条:手持"原版生鸡肉"右键任意方块表面 → 在其表面生成
|
||||
# "生鸡肉(原版生鸡肉右键放置后)"(roastchickenplace_0) 方块,消耗1个。
|
||||
# 该规则由 FeatureDispatcher 转发 ServerItemUseOnEvent 到 BarbecueService。
|
||||
ITEM_USE_ON_RULES = [
|
||||
{
|
||||
"item": "minecraft:chicken", # 手持的原版生鸡肉
|
||||
"target": "rtdd:roastchickenplace_0", # 生成的目标方块
|
||||
"consume": 1, # 消耗1个生鸡肉
|
||||
"tip": "§a已放置生鸡肉,可右键支杆上杆烤制",
|
||||
},
|
||||
]
|
||||
# 原版生鸡肉右键放置"生鸡肉(放置后)"的规则已拆到
|
||||
# xiangyemod/yuanbanfangzhi/YuanbanData.py(原版放置统一管理)。
|
||||
# 本分类不再定义 ItemUseOn 规则。
|
||||
+10
-65
@@ -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) 字典查找)
|
||||
# ============================================================================
|
||||
|
||||
Reference in new issue
Block a user