ceshi 1
This commit is contained in:
1 parent
9eb9edbb8a
commit
b768ff1555
10 files changed
+618
-15
No files matched your search
+92
-4
@@ -19,6 +19,7 @@
|
||||
共享数据 InterceptData.py (客户端/服务端同一份, 见其注释)
|
||||
================================================================================
|
||||
"""
|
||||
import time
|
||||
import mod.client.extraClientApi as clientApi
|
||||
|
||||
ClientSystem = clientApi.GetClientSystemCls()
|
||||
@@ -26,7 +27,23 @@ clientComp = clientApi.GetEngineCompFactory()
|
||||
|
||||
from ...BlueFoxTools.SpecialFunciton.BlueFoxSystem import BlueFoxClientSystem
|
||||
from .InterceptData import (ITEM_USE_ON_CANCEL, ITEM_USE_ON_CANCEL_BY_ITEM,
|
||||
SUSHI_BLOCKS, COATING_ITEMS)
|
||||
SUSHI_BLOCKS, SUSHI_CANCEL, COATING_ITEMS,
|
||||
TAKEOUT_CANCEL, GAI_FAN_CANCEL)
|
||||
|
||||
# 自定义事件: 客户端拦(碗/盘,汤锅/炒锅/油锅成品)放置预览后, 显式通知服务端执行盛出
|
||||
# 服务端在 FeatureDispatcher 用同一事件名监听(见 service/FeatureDispatcher.py)
|
||||
TAKEOUT_EVENT = "TakeoutRequest"
|
||||
|
||||
# 自定义事件: 客户端拦(成品菜/米饭, 米饭/成品菜/蛋炒饭) 盖饭转换的放置预览后,
|
||||
# 显式通知服务端执行盖饭转换(同盛出机制)。若不显式通知, 客户端 ret=True 会吞掉
|
||||
# 服务端 ServerItemUseOnEvent, 导致盖饭"点无反应"。
|
||||
GAI_FAN_EVENT = "GaifanRequest"
|
||||
|
||||
# 自定义事件: 客户端拦【其余全部 itemUseOn 转换】的放置预览后, 显式通知服务端执行(同盖饭)。
|
||||
# 覆盖: 面食(生面饼烙馍/面粉加鸡蛋变面糊/生食蒸笼)、汤锅(锅态汤->汤面)、原版装盘(南瓜派
|
||||
# 等->盘中餐)、相邻放置(放死鱼/生鸡块/切菜)、厨具蘸油(锅铲/带油锅铲)、寿司、裹粉、
|
||||
# 种水稻. 若不显式通知, 客户端 ret=True 会吞掉 ServerItemUseOnEvent, 这些转换"点无反应"。
|
||||
ITEM_USE_ON_REQUEST = "ItemUseOnRequest"
|
||||
|
||||
|
||||
class ClientFeatureDispatcher(BlueFoxClientSystem):
|
||||
@@ -35,6 +52,10 @@ class ClientFeatureDispatcher(BlueFoxClientSystem):
|
||||
def __init__(self, namespace, systemName):
|
||||
BlueFoxClientSystem.__init__(self, namespace, systemName)
|
||||
print "===== ClientFeatureDispatcher init ====="
|
||||
# 盛出/盖饭/出锅 后的客户端放置冷却: key=playerId@(x,y,z), value=时间戳.
|
||||
# 转换完成后一段时间内, 该位置再被当作"放置"会直接 ret 吞掉, 消除"转换后
|
||||
# 由于引擎重置右键导致多放置一次"的闪一下。时长 1.5 秒(用户要求明显可见)。
|
||||
self._afterCd = {}
|
||||
self.ListenForEvent(clientApi.GetEngineNamespace(),
|
||||
clientApi.GetEngineSystemName(),
|
||||
"ClientItemUseOnEvent", self, self.OnItemUseOn)
|
||||
@@ -64,9 +85,28 @@ class ClientFeatureDispatcher(BlueFoxClientSystem):
|
||||
if not itemName:
|
||||
return
|
||||
|
||||
# 纯手持物品取消 (相邻放置/手持吃物品右键表面): 只看 item
|
||||
# 转换后冷却: 同一玩家同一坐标, 若刚做过盛出/盖饭/出锅, 短时间内再被引擎
|
||||
# 当作"放置" -> 直接吞掉(不触发服务端, 也不渲染放置预览). 消除"转换后
|
||||
# 由于引擎重置右键导致的多放置闪烁"。
|
||||
pId = args.get("entityId") or args.get("playerId")
|
||||
cdKey = "%s@%s_%s_%s" % (pId, args.get("x"), args.get("y"), args.get("z"))
|
||||
_t = self._afterCd.get(cdKey)
|
||||
if _t is not None and (time.time() - _t) < 1.5:
|
||||
args["ret"] = True
|
||||
return
|
||||
|
||||
# 纯手持物品取消 (相邻放置/手持吃物品右键表面): 只看 item, 服务端走 handleItemUseOn
|
||||
# (Yuanban 相邻放置/装盘、Natural 种水稻、Shiyongfood 直接吃)。这些组合一旦客户端
|
||||
# ret=True 会吞掉 ServerItemUseOnEvent, 故必须显式通知服务端补齐(盖饭同款机制)。
|
||||
# 【注意】此分支为"相邻格放置/装盘", 被点【表面坐标】不变, 不能设 _afterCd,
|
||||
# 否则会误吞同一表面 1.5s 内的连续放置. 去重交给服务端 handleItemUseOn 自带冷却。
|
||||
if itemName in ITEM_USE_ON_CANCEL_BY_ITEM:
|
||||
args["ret"] = True
|
||||
self.NotifyToServer(ITEM_USE_ON_REQUEST, {
|
||||
"playerId": pId,
|
||||
"x": args.get("x"), "y": args.get("y"), "z": args.get("z"),
|
||||
"blockName": blockName, "itemName": itemName,
|
||||
})
|
||||
return
|
||||
|
||||
if not blockName:
|
||||
@@ -74,18 +114,66 @@ class ClientFeatureDispatcher(BlueFoxClientSystem):
|
||||
|
||||
# 精确组合 (手持item, 被点block)
|
||||
pair = (itemName, blockName)
|
||||
|
||||
# 盖饭/蛋炒饭(itemUseOn): 必须在此处理(比 ITEM_USE_ON_CANCEL 先), 否则会被
|
||||
# ITEM_USE_ON_CANCEL 纯 ret 吞掉 -> 服务端 ServerItemUseOnEvent 不触发 -> 盖饭无反应。
|
||||
if pair in GAI_FAN_CANCEL:
|
||||
args["ret"] = True
|
||||
self._afterCd[cdKey] = time.time()
|
||||
self.NotifyToServer(GAI_FAN_EVENT, {
|
||||
"playerId": pId,
|
||||
"x": args.get("x"), "y": args.get("y"), "z": args.get("z"),
|
||||
"blockName": blockName, "itemName": itemName,
|
||||
})
|
||||
return
|
||||
|
||||
# 其余 itemUseOn 转换(面食/汤锅/装盘/厨具蘸油/寿司/裹粉): 纯 ret 会吞掉服务端
|
||||
# ServerItemUseOnEvent -> 服务端 handleItemUseOn 不触发 -> "点无反应"(盖饭同款)。
|
||||
# 统一改为 ret + 显式 ItemUseOnRequest, 由服务端按 itemName 路由补齐 handleItemUseOn。
|
||||
if pair in ITEM_USE_ON_CANCEL:
|
||||
args["ret"] = True
|
||||
self._afterCd[cdKey] = time.time()
|
||||
self.NotifyToServer(ITEM_USE_ON_REQUEST, {
|
||||
"playerId": pId,
|
||||
"x": args.get("x"), "y": args.get("y"), "z": args.get("z"),
|
||||
"blockName": blockName, "itemName": itemName,
|
||||
})
|
||||
return
|
||||
|
||||
# 寿司: 手持寿司方块物品 右键 自家寿司方块 -> 取消默认放置
|
||||
# 汤锅盛出: 手持 碗/盘 右键 成品汤方块 -> 客户端取消放置预览(消闪),
|
||||
# 并显式通知服务端执行盛出(take_out)。此组合客户端拦掉后,
|
||||
# 服务端 ServerBlockUseEvent 不再触发, 故必须发 TakeoutRequest 补齐盛出逻辑。
|
||||
if pair in TAKEOUT_CANCEL:
|
||||
args["ret"] = True
|
||||
self._afterCd[cdKey] = time.time()
|
||||
self.NotifyToServer(TAKEOUT_EVENT, {
|
||||
"playerId": pId,
|
||||
"x": args.get("x"), "y": args.get("y"), "z": args.get("z"),
|
||||
"blockName": blockName, "itemName": itemName,
|
||||
})
|
||||
return
|
||||
|
||||
# 寿司: 手持寿司方块物品 右键 自家寿司方块 -> 服务端走 ShousiService.handleItemUseOn
|
||||
# (取消默认放置) + handleBlockUse(堆叠). 客户端 ret 吞事件后显式通知补齐。
|
||||
if itemName in SUSHI_BLOCKS and blockName in SUSHI_BLOCKS:
|
||||
args["ret"] = True
|
||||
self._afterCd[cdKey] = time.time()
|
||||
self.NotifyToServer(ITEM_USE_ON_REQUEST, {
|
||||
"playerId": pId,
|
||||
"x": args.get("x"), "y": args.get("y"), "z": args.get("z"),
|
||||
"blockName": blockName, "itemName": itemName,
|
||||
})
|
||||
return
|
||||
|
||||
# 裹粉: 手持生食材 右键 面粉块 -> 取消默认放置
|
||||
# 裹粉: 手持生食材 右键 面粉块 -> 服务端走 ShicaiService.handleItemUseOn(裹粉).
|
||||
if itemName in COATING_ITEMS and blockName == "rtdd:farineblock_3":
|
||||
args["ret"] = True
|
||||
self._afterCd[cdKey] = time.time()
|
||||
self.NotifyToServer(ITEM_USE_ON_REQUEST, {
|
||||
"playerId": pId,
|
||||
"x": args.get("x"), "y": args.get("y"), "z": args.get("z"),
|
||||
"blockName": blockName, "itemName": itemName,
|
||||
})
|
||||
|
||||
# ============================================================================
|
||||
# 入口3: 手持直接吃物品(长按/空中使用) -> cancel 默认吃
|
||||
|
||||
Reference in new issue
Block a user