乡野食材 功能实现 2
This commit is contained in:
1 parent
098290c6b6
commit
51804de264
10 files changed
+145
-34
No files matched your search
+29
-13
@@ -61,6 +61,7 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
blockSet = set()
|
||||
itemUseOnOwner = {}
|
||||
itemUseOnSet = set()
|
||||
itemUseOnAll = {} # 物品名 -> [服务...]: 同一物品可被多个服务注册(按注册顺序), 逐个 fallback
|
||||
timerOwner = {}
|
||||
timerSet = set()
|
||||
|
||||
@@ -91,6 +92,9 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
for itemName in service.getItemUseOnRules():
|
||||
cls.itemUseOnOwner[itemName] = service
|
||||
cls.itemUseOnSet.add(itemName)
|
||||
# 同一物品可被多个服务注册(如 食材裹粉 vs 原版放置 都处理 土豆),
|
||||
# 按注册顺序追加, OnItemUseOn 逐个 fallback
|
||||
cls.itemUseOnAll.setdefault(itemName, []).append(service)
|
||||
|
||||
@classmethod
|
||||
def registerTimer(cls, service):
|
||||
@@ -210,34 +214,46 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
def OnItemUseOn(self, args):
|
||||
"""
|
||||
手持物品右键某个方块表面时触发(如手持原版生鸡肉右键地面)。
|
||||
用手持物品名 O(1) 定位到唯一的功能服务,转发给它的 handleItemUseOn。
|
||||
用手持物品名定位到注册该物品的【所有】服务(itemUseOnAll,按注册顺序),
|
||||
逐个尝试 handleItemUseOn,第一个返回 True 的服务处理成功:
|
||||
- 食材裹粉(ShicaiService) 与 原版放置(YuanbanService) 都注册了 土豆/鸡肉/猪肉,
|
||||
手持这些物品右键面粉块 → 裹粉先命中; 右键地面 → 裹粉返回 False 后交给原版放置。
|
||||
|
||||
取消"使用物品于方块"的字段是 ret(不是 cancel),官方要求双端设置才能
|
||||
真正取消默认行为。本分发器已在服务端设 ret=True。
|
||||
"""
|
||||
itemName = args.get("itemName")
|
||||
service = self.itemUseOnOwner.get(itemName)
|
||||
print "[FD-ItemUseOn]", itemName, "svc:", (service.__class__.__name__ if service else "NONE")
|
||||
if not service:
|
||||
services = self.itemUseOnAll.get(itemName)
|
||||
if not services:
|
||||
return
|
||||
print "[FD-ItemUseOn]", itemName, "svcs:", [s.__class__.__name__ for s in services]
|
||||
|
||||
# 被点方块属于某个"右键方块"服务的管辖(条箱/挂肉钩/锅具等) → 该方块右键由
|
||||
# ServerBlockUseEvent 处理(放入/挂鱼/做菜), 不执行"手持物品右键表面放置",
|
||||
# 避免与方块右键逻辑重复(如手持鲑鱼右键条箱应放入而非放置死鲑鱼)。
|
||||
playerId = args.get("playerId") or args.get("entityId")
|
||||
# 被点方块(用于去重: 该方块归哪个右键服务管辖)
|
||||
clickedName = None
|
||||
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
|
||||
clickedName = b.get("name") if b else None
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
handled = service.handleItemUseOn(args)
|
||||
if handled:
|
||||
args['ret'] = True
|
||||
self._cancelItemUse[playerId] = True
|
||||
for service in services:
|
||||
# 被点方块属于某个"右键方块"服务的管辖(条箱/挂肉钩/锅具等) → 该方块右键由
|
||||
# ServerBlockUseEvent 处理(放入/挂鱼/做菜), 跳过本服务的 itemUseOn,
|
||||
# 避免与方块右键逻辑重复(如手持鲑鱼右键条箱应放入而非放置死鲑鱼)。
|
||||
# 例外: 被点方块的 owner 就是当前服务自己(如 食材裹粉: 面粉块归 ShicaiService
|
||||
# 管辖, 手持生食材右键它时放行给 handleItemUseOn 处理) 则继续尝试。
|
||||
if clickedName and clickedName in self.blockOwner:
|
||||
if self.blockOwner[clickedName] is not service:
|
||||
continue
|
||||
|
||||
handled = service.handleItemUseOn(args)
|
||||
if handled:
|
||||
args['ret'] = True
|
||||
self._cancelItemUse[playerId] = True
|
||||
return
|
||||
|
||||
# ============================================================================
|
||||
# 主入口3:拦截物品使用(防止喝药水/吃食物等默认行为)
|
||||
|
||||
Reference in new issue
Block a user