市场贸易实现 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

@@ -64,6 +64,14 @@ class FeatureDispatcher(BlueFoxServerSystem):
timerOwner = {}
timerSet = set()
# ---- 拆方块掉落映射: 方块名 → 掉落对应的原版生食材 ----
# 玩家左键破坏这些"放置的半成品/死鱼"方块时, 取消默认掉落, 改为掉对应的原版生食材
DESTROY_DROP = {
"rtdd:killfish_0": "minecraft:salmon", # 死鲑鱼 → 原版生鲑鱼
"rtdd:killcod_0": "minecraft:cod", # 死鳕鱼 → 原版生鳕鱼
"rtdd:roastchickenplace_0": "minecraft:chicken", # 生鸡肉(放置后) → 原版生鸡肉
}
# ============================================================================
# 注册接口(功能服务在 __init__ 里调用)
# ============================================================================
@@ -128,11 +136,12 @@ class FeatureDispatcher(BlueFoxServerSystem):
def ListenEvent(self):
"""
注册四个事件:
注册五个事件:
1. ServerBlockUseEvent —— 玩家右键方块(所有功能的右键转换入口)
2. ServerItemUseOnEvent —— 手持物品右键方块表面(如放置生鸡肉)
3. ServerItemTryUseEvent —— 玩家尝试使用物品(拦截喝药水/吃食物等默认行为)
4. ServerBlockEntityTickEvent —— 计时方块每tick触发(烤制/饲料变空等,持久化计时)
5. ServerPlayerTryDestroyBlockEvent —— 玩家拆方块(放置的死鱼/生鸡肉掉回原版生食材)
"""
self.ListenForEvent(serverApi.GetEngineNamespace(),
serverApi.GetEngineSystemName(),
@@ -146,6 +155,9 @@ class FeatureDispatcher(BlueFoxServerSystem):
self.ListenForEvent(serverApi.GetEngineNamespace(),
serverApi.GetEngineSystemName(),
"ServerBlockEntityTickEvent", self, self.OnBlockEntityTick)
self.ListenForEvent(serverApi.GetEngineNamespace(),
serverApi.GetEngineSystemName(),
"ServerPlayerTryDestroyBlockEvent", self, self.OnDestroy)
def UnListenEvent(self):
self.UnListenForEvent(serverApi.GetEngineNamespace(),
@@ -160,6 +172,9 @@ class FeatureDispatcher(BlueFoxServerSystem):
self.UnListenForEvent(serverApi.GetEngineNamespace(),
serverApi.GetEngineSystemName(),
"ServerBlockEntityTickEvent", self, self.OnBlockEntityTick)
self.UnListenForEvent(serverApi.GetEngineNamespace(),
serverApi.GetEngineSystemName(),
"ServerPlayerTryDestroyBlockEvent", self, self.OnDestroy)
# ============================================================================
# 主入口1:玩家右键方块 → 按 blockOwner 路由到右键服务
@@ -204,11 +219,22 @@ class FeatureDispatcher(BlueFoxServerSystem):
if not service:
return
# 被点方块属于某个"右键方块"服务的管辖(条箱/挂肉钩/锅具等) → 该方块右键由
# ServerBlockUseEvent 处理(放入/挂鱼/做菜), 不执行"手持物品右键表面放置",
# 避免与方块右键逻辑重复(如手持鲑鱼右键条箱应放入而非放置死鲑鱼)。
playerId = args.get("playerId") or args.get("entityId")
try:
dim = comp.CreateDimension(playerId).GetEntityDimensionId()
b = comp.CreateBlockInfo(LevelId).GetBlockNew(
(args.get("x"), args.get("y"), args.get("z")), dim)
if b and b.get("name") in self.blockOwner:
return
except Exception:
pass
handled = service.handleItemUseOn(args)
if handled:
args['ret'] = True
# ServerItemUseOnEvent 的玩家键是 entityId,不是 playerId
playerId = args.get("playerId") or args.get("entityId")
self._cancelItemUse[playerId] = True
# ============================================================================
@@ -253,3 +279,39 @@ class FeatureDispatcher(BlueFoxServerSystem):
if not service:
return
service.handleBlockEntityTick(args)
# ============================================================================
# 主入口5:玩家拆方块 → 放置的死鱼/生鸡肉掉回原版生食材
# ============================================================================
def OnDestroy(self, args):
"""
玩家拆方块时触发。
部分"放置的半成品/死鱼"方块被拆掉时, 取消默认掉落(不把方块本身掉出来),
手动清空方块并掉落对应的原版生食材:
- killfish_0(死鲑鱼) → 原版生鲑鱼
- killcod_0(死鳕鱼) → 原版生鳕鱼
- roastchickenplace_0(生鸡肉放置后) → 原版生鸡肉
"""
blockName = args.get("blockName")
itemName = self.DESTROY_DROP.get(blockName)
if not itemName:
return
playerId = args.get("playerId")
x, y, z = args.get("x"), args.get("y"), args.get("z")
dim = comp.CreateDimension(playerId).GetEntityDimensionId()
# 取消默认破坏(不让方块本身作为掉落物掉出来)
args['cancel'] = True
# 手动清空方块
try:
comp.CreateBlockInfo(LevelId).SetBlockNew(
(x, y, z), blockDict={"name": "minecraft:air", "aux": 0},
oldBlockHandling=0, dimensionId=dim)
except Exception:
pass
# 掉落对应的原版生食材
try:
itemDict = {"itemName": itemName, "count": 1, "auxValue": 0}
self.CreateEngineItemEntity(itemDict, dim, (x, y + 0.5, z))
except Exception:
pass