发光 垃圾桶问题
This commit is contained in:
1 parent
61c7c71016
commit
14e5057d58
7 files changed
+81
-2
No files matched your search
+31
-1
@@ -29,7 +29,7 @@ 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, BLOCKUSE_CANCEL,
|
||||
BLOCKUSE_CANCEL_ITEMS,
|
||||
BLOCKUSE_CANCEL_ITEMS, BLOCKUSE_CANCEL_ANY_BLOCKS,
|
||||
PLACE_ITEMS, EAT_ITEMS)
|
||||
|
||||
# 自定义事件: 客户端拦(碗/盘,汤锅/炒锅/油锅成品)放置预览后, 显式通知服务端执行盛出
|
||||
@@ -73,6 +73,10 @@ class ClientFeatureDispatcher(BlueFoxClientSystem):
|
||||
# 用于 OnItemTryUse(投掷/使用轨道)在 0.2s 内取消该玩家的投掷动画(如鸡蛋右键鸡窝
|
||||
# 放蛋后引擎重置右键立即触发投掷 -> 扔蛋)。cd 到即放行, 对地扔蛋正常。
|
||||
self._blockCdPlayer = {}
|
||||
# 玩家级"刚对垃圾桶等'任意物品'方块做过拦截"短标记: key=playerId, value=时间戳.
|
||||
# 垃圾桶规则是 item="*any", 无法用 item 精确判断, 故用玩家级窗口在 0.2s 内取消
|
||||
# 同一右键伴随的那次"吃/用"(如手持葡萄右键垃圾桶, 取消吃葡萄)。
|
||||
self._anyBlockPlayer = {}
|
||||
self.ListenForEvent(clientApi.GetEngineNamespace(),
|
||||
clientApi.GetEngineSystemName(),
|
||||
"ClientItemUseOnEvent", self, self.OnItemUseOn)
|
||||
@@ -141,6 +145,24 @@ class ClientFeatureDispatcher(BlueFoxClientSystem):
|
||||
})
|
||||
return
|
||||
|
||||
# 【垃圾桶等"任意物品"方块】该方块的规则是 item="*any", 不参与 (item, block)
|
||||
# 精确派生, 无法按 item 判断, 故按被点方块整块拦截: 手持任意非空物品右键垃圾桶
|
||||
# (关/开/有垃圾三态)时, 原版会先执行 吃(葡萄等食物)/放置(胡萝卜等方块),
|
||||
# 服务端再取消已晚 -> "一边吃一边清空"/"直接放置"。此处 ret 掉默认行为消闪,
|
||||
# 再显式 BlockUseRequest 让服务端照常 清空主手/开盖; 同时打玩家级标记, 取消
|
||||
# 同一右键伴随的那次"吃"(详见 OnItemTryUse)。
|
||||
if blockName and blockName in BLOCKUSE_CANCEL_ANY_BLOCKS:
|
||||
args["ret"] = True
|
||||
self._blockCd[cdKey] = time.time()
|
||||
self._blockCdPlayer[pId] = time.time()
|
||||
self._anyBlockPlayer[pId] = time.time()
|
||||
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, 故必须显式通知服务端补齐(盖饭同款机制)。
|
||||
@@ -236,6 +258,14 @@ class ClientFeatureDispatcher(BlueFoxClientSystem):
|
||||
itemName = None
|
||||
_pId = args.get("playerId") or args.get("entityId")
|
||||
|
||||
# 垃圾桶等"任意物品"方块: 玩家级 0.2s 窗口内直接取消伴随的"吃/用"。
|
||||
# 不限物品名(该场景是"任意物品"被扔进垃圾桶/开盖, 而非吃它), 故不能用
|
||||
# BLOCKUSE_CANCEL_ITEMS 判断, 单独用 _anyBlockPlayer 标记。
|
||||
_ac = self._anyBlockPlayer.get(_pId, 0)
|
||||
if _ac and (time.time() - _ac) < 0.2:
|
||||
args["cancel"] = True
|
||||
return
|
||||
|
||||
# 优先: 玩家刚做过 BlockUse 转换(0.2s 内, 如炒锅/汤锅/油锅放料、鸡蛋放鸡窝、上杆),
|
||||
# 引擎重置右键会立即再触发一次"吃/投掷/倒水"。此窗口内若手持该转换涉及的可食用/可用
|
||||
# 物品(BLOCKUSE_CANCEL_ITEMS), 直接 cancel 掉默认吃/投掷, 避免"放料却吃了食物"。
|
||||
|
||||
@@ -337,6 +337,26 @@ BLOCKUSE_CANCEL_ITEMS = set(
|
||||
_it for (_it, _bk) in BLOCKUSE_CANCEL
|
||||
)
|
||||
|
||||
# ---- 通配"任意物品"转换(垃圾桶)的【整块】拦截集合 ----
|
||||
# 垃圾桶规则的 item="*any"(任意非空物品), 无法枚举成 (item, block) 对, 上面的精确派生
|
||||
# 会整条跳过 -> 手持 葡萄(吃)/胡萝卜(放置) 右键垃圾桶时客户端不拦, 原版先吃/先放,
|
||||
# 服务端再取消已经太晚("一边吃葡萄一边清空"/"直接放置")。故改为按"被点方块"整块拦截。
|
||||
# 派生条件: 规则表里 item == "*any" 且【无 below 前置条件】。
|
||||
# (带 below 的如丸子机 meatballmaker_2 需下方有炉灶, 客户端无法判断, 不能无条件拦,
|
||||
# 否则条件不满足时会吞掉玩家正常对着它吃东西/放东西。)
|
||||
BLOCKUSE_CANCEL_ANY_BLOCKS = set()
|
||||
for _tbl in _BLOCK_USE_TABLES:
|
||||
for _r in _as_list(_tbl):
|
||||
if not isinstance(_r, dict):
|
||||
continue
|
||||
if _r.get("item") != "*any":
|
||||
continue
|
||||
if _r.get("below"):
|
||||
continue # 有前置条件(如炉灶)的客户端无法判断, 不拦
|
||||
_bk = _r.get("source") or _r.get("block")
|
||||
if isinstance(_bk, basestring) and _bk:
|
||||
BLOCKUSE_CANCEL_ANY_BLOCKS.add(_bk)
|
||||
|
||||
# ---- Chuju 锅铲/油罐 inline 转换(在 ChujuService.handleItemUseOn 内联, 不在数据表) ----
|
||||
# 手持 锅铲/带油锅铲 右键 油罐(oilcan)/炒锅(wok) 蘸油/还油/上油 -> 取消默认
|
||||
CHUJU_INLINE_CANCEL = {
|
||||
|
||||
@@ -36,6 +36,9 @@
|
||||
"minecraft:block_light_absorption": {
|
||||
"value": 0
|
||||
},
|
||||
"minecraft:block_light_emission": {
|
||||
"emission": 1.0
|
||||
},
|
||||
"netease:render_layer": {
|
||||
"value": "alpha"
|
||||
},
|
||||
|
||||
@@ -36,6 +36,9 @@
|
||||
"minecraft:block_light_absorption": {
|
||||
"value": 0
|
||||
},
|
||||
"minecraft:block_light_emission": {
|
||||
"emission": 1.0
|
||||
},
|
||||
"netease:render_layer": {
|
||||
"value": "alpha"
|
||||
},
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
"minecraft:block_light_absorption": {
|
||||
"value": 0
|
||||
},
|
||||
"minecraft:block_light_emission": {
|
||||
"emission": 1.0
|
||||
},
|
||||
"netease:render_layer": {
|
||||
"value": "alpha"
|
||||
},
|
||||
|
||||
@@ -36,6 +36,9 @@
|
||||
"minecraft:block_light_absorption": {
|
||||
"value": 0
|
||||
},
|
||||
"minecraft:block_light_emission": {
|
||||
"emission": 1.0
|
||||
},
|
||||
"netease:render_layer": {
|
||||
"value": "alpha"
|
||||
},
|
||||
|
||||
+18
-1
@@ -197,4 +197,21 @@ ServerItemUseOnEvent 重复触发也会被冷却拦截, 不双重消耗。
|
||||
- 十、总食用 手持直接吃(饭团/水煮蛋/豆腐, 右键表面吃) [已统一]
|
||||
【注意】"相邻放置/装盘"分支(ITEM_USE_ON_CANCEL_BY_ITEM)因被点【表面坐标】不变,
|
||||
不设 _afterCd(避免误吞同一表面 1.5s 内连续放置), 去重交给服务端 handleItemUseOn 冷却。
|
||||
"盖饭/蛋炒饭"(GAI_FAN_CANCEL)、"盛出/出锅"(TAKEOUT_CANCEL) 仍用各自专用事件, 不变。
|
||||
"盖饭/蛋炒饭"(GAI_FAN_CANCEL)、"盛出/出锅"(TAKEOUT_CANCEL) 仍用各自专用事件, 不变。
|
||||
|
||||
|
||||
========================================
|
||||
十四、"任意物品"功能方块的整块拦截 (InterceptData.BLOCKUSE_CANCEL_ANY_BLOCKS, 2026-09-30)
|
||||
========================================
|
||||
问题: 垃圾桶规则是 item="*any"(任意非空物品), 不在 (item, block) 精确派生范围内
|
||||
(BLOCKUSE_CANCEL 派生时显式跳过通配 item) -> 客户端不拦:
|
||||
- 手持葡萄等食物右键垃圾桶(打开): 原版先"吃", 服务端再取消已晚 -> "一边吃一边清空";
|
||||
- 手持胡萝卜等方块物品右键垃圾桶: 原版先"放置" -> 垃圾桶旁直接多放一块。
|
||||
方案: 新增按【被点方块】整块拦截的集合 BLOCKUSE_CANCEL_ANY_BLOCKS:
|
||||
客户端 OnItemUseOn 命中该方块(手持任意非空物品) -> ret=True(消闪) + NotifyToServer
|
||||
('BlockUseRequest') 走服务端 handleBlockUse; 并在 OnItemTryUse 用玩家级 0.2s 窗口
|
||||
(_anyBlockPlayer)取消同一右键伴随的那次"吃/用"。
|
||||
派生: 各 _BLOCK_USE_TABLES 中 item=="*any" 且【无 below 前置条件】的规则的 source 方块。
|
||||
- 垃圾桶三态: rtdd:storage_buckets(关) / rtdd:rubbish_bin_2(打开,掉垃圾清空主手) / rtdd:b_160(有垃圾)
|
||||
【排除】带 below 的"任意物品"规则(如丸子机 meatballmaker_2 需下方有炉灶)不纳入:
|
||||
客户端无法判断 below 条件, 无条件拦会吞掉条件不满足时玩家正常的吃/放置。
|
||||
Reference in new issue
Block a user