ceshi 2 bug处理ok
This commit is contained in:
1 parent
b768ff1555
commit
faa3a22631
8 files changed
+314
-52
No files matched your search
+51
-1
@@ -28,7 +28,8 @@ clientComp = clientApi.GetEngineCompFactory()
|
||||
from ...BlueFoxTools.SpecialFunciton.BlueFoxSystem import BlueFoxClientSystem
|
||||
from .InterceptData import (ITEM_USE_ON_CANCEL, ITEM_USE_ON_CANCEL_BY_ITEM,
|
||||
SUSHI_BLOCKS, SUSHI_CANCEL, COATING_ITEMS,
|
||||
TAKEOUT_CANCEL, GAI_FAN_CANCEL)
|
||||
TAKEOUT_CANCEL, GAI_FAN_CANCEL, BLOCKUSE_CANCEL,
|
||||
BLOCKUSE_CANCEL_ITEMS)
|
||||
|
||||
# 自定义事件: 客户端拦(碗/盘,汤锅/炒锅/油锅成品)放置预览后, 显式通知服务端执行盛出
|
||||
# 服务端在 FeatureDispatcher 用同一事件名监听(见 service/FeatureDispatcher.py)
|
||||
@@ -45,6 +46,13 @@ GAI_FAN_EVENT = "GaifanRequest"
|
||||
# 种水稻. 若不显式通知, 客户端 ret=True 会吞掉 ServerItemUseOnEvent, 这些转换"点无反应"。
|
||||
ITEM_USE_ON_REQUEST = "ItemUseOnRequest"
|
||||
|
||||
# 自定义事件: 客户端拦(手持可放置/可投掷物品, 功能方块)放置预览后, 显式通知服务端执行
|
||||
# BlockUse 转换(根因B). 例如手持 生鸡肉/鳕鱼/鲑鱼 右键 支杆 -> 上杆; 死鱼右键挂肉钩 ->
|
||||
# 挂放; 鸡蛋右键鸡窝 -> 放蛋; 胡萝卜右键饲料槽 -> 加料; 盘子右键丸子机/石磨 -> 盛取;
|
||||
# 木条右键炉灶 -> 点火. 客户端 ret 掉放置/投掷预览后 NotifyToServer, 服务端按被点方块
|
||||
# blockOwnerAll 路由到 handleBlockUse(与 TakeoutRequest 同机制).
|
||||
BLOCK_USE_REQUEST = "BlockUseRequest"
|
||||
|
||||
|
||||
class ClientFeatureDispatcher(BlueFoxClientSystem):
|
||||
"""客户端右键拦截: 白名单提前 cancel/ret, 消除闪烁"""
|
||||
@@ -56,6 +64,14 @@ class ClientFeatureDispatcher(BlueFoxClientSystem):
|
||||
# 转换完成后一段时间内, 该位置再被当作"放置"会直接 ret 吞掉, 消除"转换后
|
||||
# 由于引擎重置右键导致多放置一次"的闪一下。时长 1.5 秒(用户要求明显可见)。
|
||||
self._afterCd = {}
|
||||
# BlockUse 转换(手持食材/鸡蛋右键功能方块)的独立短冷却: 回调方块后的 0.2s 内
|
||||
# 该坐标再被当作右键会直接 ret 吞掉, 防止"放蛋后连点被误当投掷扔出去"。
|
||||
# 时长 0.2 秒(用户指定"稍微停一下0.1~0.2秒"); 翻炒(0.3s 间隔)不受影响。
|
||||
self._blockCd = {}
|
||||
# 玩家级"刚做过 BlockUse 转换(放蛋/放料)"短标记: key=playerId, value=时间戳.
|
||||
# 用于 OnItemTryUse(投掷/使用轨道)在 0.2s 内取消该玩家的投掷动画(如鸡蛋右键鸡窝
|
||||
# 放蛋后引擎重置右键立即触发投掷 -> 扔蛋)。cd 到即放行, 对地扔蛋正常。
|
||||
self._blockCdPlayer = {}
|
||||
self.ListenForEvent(clientApi.GetEngineNamespace(),
|
||||
clientApi.GetEngineSystemName(),
|
||||
"ClientItemUseOnEvent", self, self.OnItemUseOn)
|
||||
@@ -95,6 +111,31 @@ class ClientFeatureDispatcher(BlueFoxClientSystem):
|
||||
args["ret"] = True
|
||||
return
|
||||
|
||||
# BlockUse 转换短冷却: 放蛋/放料后 0.2s 内同一坐标再被当作右键(引擎重置导致的
|
||||
# 二次使用/投掷)直接吞掉, 防止"连点鸡窝被误当扔蛋"。时长 0.2s(用户指定, 不卡翻炒)。
|
||||
_bcd = self._blockCd.get(cdKey)
|
||||
if _bcd is not None and (time.time() - _bcd) < 0.2:
|
||||
args["ret"] = True
|
||||
return
|
||||
|
||||
# 【根因B】手持可放置/可投掷物品 右键功能方块(支杆/挂肉钩/鸡窝/饲料槽/丸子机/石磨/
|
||||
# 炉灶/寿司/炒锅放料 等) -> 此组合是 BlockUse 转换(服务端 handleBlockUse), 不能走下面
|
||||
# ITEM_USE_ON_CANCEL_BY_ITEM 的"相邻放置"(那会绕开 owners 检查把死鱼/死鸡放到地面)。
|
||||
# 此处 ret 掉放置/投掷预览 + 显式 BlockUseRequest, 由服务端按被点方块 handleBlockUse。
|
||||
# 【注意】这里设 _blockCd(0.2s 短冷却): 放蛋/放料转换后引擎重置右键会再触发一次
|
||||
# "使用/投掷", 若这次也被当正常右键会扔蛋/放着。0.2s 内同坐标直接吞掉, 既消扔蛋又
|
||||
# 不卡翻炒(翻炒 0.3s 间隔 > 0.2s)。去重同时靠服务端 handleBlockUse 自带 checkCooldown。
|
||||
if blockName and (itemName, blockName) in BLOCKUSE_CANCEL:
|
||||
args["ret"] = True
|
||||
self._blockCd[cdKey] = time.time()
|
||||
self._blockCdPlayer[pId] = time.time() # 玩家级短标记, 取消随后 0.2s 内投掷动画
|
||||
self.NotifyToServer(BLOCK_USE_REQUEST, {
|
||||
"playerId": pId,
|
||||
"x": args.get("x"), "y": args.get("y"), "z": args.get("z"),
|
||||
"blockName": blockName, "itemName": itemName,
|
||||
})
|
||||
return
|
||||
|
||||
# 纯手持物品取消 (相邻放置/手持吃物品右键表面): 只看 item, 服务端走 handleItemUseOn
|
||||
# (Yuanban 相邻放置/装盘、Natural 种水稻、Shiyongfood 直接吃)。这些组合一旦客户端
|
||||
# ret=True 会吞掉 ServerItemUseOnEvent, 故必须显式通知服务端补齐(盖饭同款机制)。
|
||||
@@ -187,6 +228,15 @@ class ClientFeatureDispatcher(BlueFoxClientSystem):
|
||||
# 饭团/水煮蛋/豆腐 在 ITEM_USE_ON_CANCEL_BY_ITEM 里(EAT_ITEMS)
|
||||
if itemName in ITEM_USE_ON_CANCEL_BY_ITEM:
|
||||
args["cancel"] = True
|
||||
# 投掷/使用抑制: 玩家刚做过 BlockUse 转换(0.2s 内, 如放蛋/放料), 引擎重置右键会立即
|
||||
# 再触发一次"投掷/使用"动画(鸡蛋右键鸡窝放蛋 -> 扔蛋)。此窗口内若手持 BlockUse 可投掷/
|
||||
# 可用物品, 直接 cancel 掉投掷; 窗口过后放行(对地扔蛋正常)。
|
||||
# 注意: 玩家级标记(pId)而非坐标——投掷事件无目标方块坐标, 只有玩家。0.2s 极短且仅在
|
||||
# 刚做完方块转换后生效, 不会影响玩家正常对地面/空中扔蛋。
|
||||
_pId = args.get("playerId") or args.get("entityId")
|
||||
_pc = self._blockCdPlayer.get(_pId, 0)
|
||||
if _pc and (time.time() - _pc) < 0.2 and itemName in BLOCKUSE_CANCEL_ITEMS:
|
||||
args["cancel"] = True
|
||||
|
||||
|
||||
# 注: 客户端系统需在客户端进程被实例化。modMain 只能在服务端 import 服务端
|
||||
|
||||
Reference in new issue
Block a user