破坏掉落存储物品 (keyong)

This commit is contained in:
wenhe committed 2026-09-03 17:07:41 +08:00
1 parent 0cb1da680d
commit 620500ab45
11 files changed
+373 -101

No files matched your search

@@ -287,21 +287,31 @@ class FeatureDispatcher(BlueFoxServerSystem):
def OnDestroy(self, args):
"""
玩家拆方块时触发。
部分"放置的半成品/死鱼"方块被拆掉时, 取消默认掉落(不把方块本身掉出来),
手动清空方块并掉落对应的原版生食材:
- killfish_0(死鲑鱼) → 原版生鲑鱼
- killcod_0(死鳕鱼) → 原版生鳕鱼
- roastchickenplace_0(生鸡肉放置后) → 原版生鸡肉
注意: ServerPlayerTryDestroyBlockEvent 的方块名字段是 fullName(不是 blockName)!
优先级:
1. 有"破坏掉落"逻辑的服务(如家具的存物方块: 书柜/药水架/厨具架
被拆掉 → 掉 空方块本体+全部存储物品, 与售卖盒不同, 破坏后取不到)
2. 静态映射: 放置的死鱼/生鸡肉掉回原版生食材
"""
blockName = args.get("blockName")
blockName = args.get("fullName") or args.get("blockName")
args["blockName"] = blockName # 统一成 blockName 字段, 服务内部直接用
# 1. 优先: 归属的右键服务实现了 handleDestroy → 交给服务处理
service = self.blockOwner.get(blockName)
if service and hasattr(service, "handleDestroy"):
if service.handleDestroy(args):
return
# 2. 静态映射: 放置的死鱼/生鸡肉 → 原版生食材
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
args['spawnResources'] = False
# 手动清空方块
try:
comp.CreateBlockInfo(LevelId).SetBlockNew(