市场贸易实现 bug修复
This commit is contained in:
1 parent
1f329f8b4c
commit
cae9bcb19e
25 files changed
+1300
-187
No files matched your search
+65
-3
@@ -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
|
||||
Reference in new issue
Block a user