右键 改2
This commit is contained in:
1 parent
e118892a1d
commit
45d328b339
19 files changed
+826
-7
No files matched your search
@@ -29,5 +29,8 @@ from xiangyemod.chaoguo.service.ChaoguoTimerService import ChaoguoTimerService
|
||||
from xiangyemod.shiyongfood.service.ShiyongfoodService import ShiyongfoodService
|
||||
|
||||
if not serverApi.IsInServer():
|
||||
# 客户端进程: 导入客户端拦截系统(继承 BlueFoxClientSystem, 框架自动注册),
|
||||
# 提前取消右键默认行为, 消除服务端拦截的"闪一下"
|
||||
from xiangyemod.service.ClientFeatureDispatcher import ClientFeatureDispatcher
|
||||
pass
|
||||
LoadMod()
|
||||
+118
@@ -0,0 +1,118 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
================================================================================
|
||||
客户端右键拦截系统(ClientFeatureDispatcher)
|
||||
================================================================================
|
||||
【作用】
|
||||
在客户端提前拦截"手持物品右键功能方块"的默认行为(吃/放置前摇),
|
||||
消除服务端取消带来的"闪一下"视觉问题。与服务端 FeatureDispatcher 配合:
|
||||
客户端先 cancel/ret, 再由服务端精确处理转换。
|
||||
|
||||
【监听事件】(全模组客户端唯一拦截点)
|
||||
1. ClientBlockUseEvent 右键功能方块 -> cancel=True
|
||||
2. ClientItemUseOnEvent 手持白名单物品右键方块表面 -> ret=True
|
||||
3. ClientItemTryUseEvent 手持直接吃物品(饭团/水煮蛋/豆腐) -> cancel=True
|
||||
|
||||
【白名单来源】
|
||||
共享数据 InterceptData.py (客户端/服务端同一份, 见其注释)
|
||||
================================================================================
|
||||
"""
|
||||
import mod.client.extraClientApi as clientApi
|
||||
|
||||
ClientSystem = clientApi.GetClientSystemCls()
|
||||
clientComp = clientApi.GetEngineCompFactory()
|
||||
|
||||
from ...BlueFoxTools.SpecialFunciton.BlueFoxSystem import BlueFoxClientSystem
|
||||
from .InterceptData import (ITEM_USE_ON_CANCEL, ITEM_USE_ON_CANCEL_BY_ITEM,
|
||||
BLOCK_USE_CANCEL, SUSHI_BLOCKS, COATING_ITEMS)
|
||||
|
||||
|
||||
class ClientFeatureDispatcher(BlueFoxClientSystem):
|
||||
"""客户端右键拦截: 白名单提前 cancel/ret, 消除闪烁"""
|
||||
|
||||
def __init__(self, namespace, systemName):
|
||||
BlueFoxClientSystem.__init__(self, namespace, systemName)
|
||||
print "===== ClientFeatureDispatcher init ====="
|
||||
self.ListenForEvent(clientApi.GetEngineNamespace(),
|
||||
clientApi.GetEngineSystemName(),
|
||||
"ClientBlockUseEvent", self, self.OnBlockUse)
|
||||
self.ListenForEvent(clientApi.GetEngineNamespace(),
|
||||
clientApi.GetEngineSystemName(),
|
||||
"ClientItemUseOnEvent", self, self.OnItemUseOn)
|
||||
self.ListenForEvent(clientApi.GetEngineNamespace(),
|
||||
clientApi.GetEngineSystemName(),
|
||||
"ClientItemTryUseEvent", self, self.OnItemTryUse)
|
||||
|
||||
def Destroy(self):
|
||||
print "===== ClientFeatureDispatcher Destroy ====="
|
||||
self.UnListenForEvent(clientApi.GetEngineNamespace(),
|
||||
clientApi.GetEngineSystemName(),
|
||||
"ClientBlockUseEvent", self, self.OnBlockUse)
|
||||
self.UnListenForEvent(clientApi.GetEngineNamespace(),
|
||||
clientApi.GetEngineSystemName(),
|
||||
"ClientItemUseOnEvent", self, self.OnItemUseOn)
|
||||
self.UnListenForEvent(clientApi.GetEngineNamespace(),
|
||||
clientApi.GetEngineSystemName(),
|
||||
"ClientItemTryUseEvent", self, self.OnItemTryUse)
|
||||
|
||||
# ============================================================================
|
||||
# 入口1: 右键功能方块 -> 提前 cancel 默认交互
|
||||
# ============================================================================
|
||||
def OnBlockUse(self, args):
|
||||
blockName = args.get("blockName")
|
||||
if blockName in BLOCK_USE_CANCEL:
|
||||
args["cancel"] = True
|
||||
|
||||
# ============================================================================
|
||||
# 入口2: 手持物品右键方块表面 -> 白名单组合才 ret
|
||||
# ============================================================================
|
||||
def OnItemUseOn(self, args):
|
||||
blockName = args.get("blockName")
|
||||
try:
|
||||
itemDict = args.get("itemDict") or {}
|
||||
itemName = itemDict.get("newItemName") or itemDict.get("itemName")
|
||||
except Exception:
|
||||
itemName = None
|
||||
if not itemName:
|
||||
return
|
||||
|
||||
# 纯手持物品取消 (相邻放置/手持吃物品右键表面): 只看 item
|
||||
if itemName in ITEM_USE_ON_CANCEL_BY_ITEM:
|
||||
args["ret"] = True
|
||||
return
|
||||
|
||||
if not blockName:
|
||||
return
|
||||
|
||||
# 精确组合 (手持item, 被点block)
|
||||
pair = (itemName, blockName)
|
||||
if pair in ITEM_USE_ON_CANCEL:
|
||||
args["ret"] = True
|
||||
return
|
||||
|
||||
# 寿司: 手持寿司方块物品 右键 自家寿司方块 -> 取消默认放置
|
||||
if itemName in SUSHI_BLOCKS and blockName in SUSHI_BLOCKS:
|
||||
args["ret"] = True
|
||||
return
|
||||
|
||||
# 裹粉: 手持生食材 右键 面粉块 -> 取消默认放置
|
||||
if itemName in COATING_ITEMS and blockName == "rtdd:farineblock_3":
|
||||
args["ret"] = True
|
||||
|
||||
# ============================================================================
|
||||
# 入口3: 手持直接吃物品(长按/空中使用) -> cancel 默认吃
|
||||
# ============================================================================
|
||||
def OnItemTryUse(self, args):
|
||||
try:
|
||||
itemDict = args.get("itemDict") or {}
|
||||
itemName = itemDict.get("newItemName") or itemDict.get("itemName")
|
||||
except Exception:
|
||||
itemName = None
|
||||
# 饭团/水煮蛋/豆腐 在 ITEM_USE_ON_CANCEL_BY_ITEM 里(EAT_ITEMS)
|
||||
if itemName in ITEM_USE_ON_CANCEL_BY_ITEM:
|
||||
args["cancel"] = True
|
||||
|
||||
|
||||
# 注: 客户端系统需在客户端进程被实例化。modMain 只能在服务端 import 服务端
|
||||
# 系统; 客户端系统由 BlueFox 框架自动注册其子类。为确保本类被加载, 需在
|
||||
# modMain 客户端分支(IsInServer()==False)里 import 本模块。
|
||||
+4
-7
@@ -256,13 +256,10 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
|
||||
owners = self.blockOwnerAll.get(clickedName) if clickedName else None
|
||||
|
||||
# 手持方块物品右键"功能方块"(右键服务管辖的方块): 若没有任何 itemUseOn
|
||||
# 服务会处理它, 直接取消默认放置 —— 防止"先放一个方块再消失"的体验
|
||||
# (例如手持生饺子右键蒸笼、手持方块右键面团等, 意图是转换而非放置)
|
||||
if clickedName and owners and (not services or not any(
|
||||
s in owners for s in services)):
|
||||
args['ret'] = True
|
||||
return
|
||||
# 【已移除宽泛兜底】以前"手持方块物品右键任何功能方块且无 itemUseOn 服务
|
||||
# 就 ret=True 取消默认放置", 导致正常放置失效。现在改由客户端白名单精确
|
||||
# 拦截(见 ClientFeatureDispatcher + InterceptData), 服务端只处理真正注册了
|
||||
# itemUseOn 的组合, 其余一律放行(放置恢复正常)。
|
||||
|
||||
if not services:
|
||||
return
|
||||
|
||||
+182
@@ -0,0 +1,182 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
================================================================================
|
||||
右键拦截白名单数据(共享,客户端/服务端共用)
|
||||
================================================================================
|
||||
【作用】
|
||||
统一管理"手持物品右键功能方块"时, 需要【提前取消该物品默认行为
|
||||
(右键吃/放置)】的精确组合。客户端 ClientFeatureDispatcher 用它提前
|
||||
cancel/ret 消除闪烁; 服务端 FeatureDispatcher 读同一份, 保持一致。
|
||||
|
||||
【为什么需要】
|
||||
不精确拦截会造成两种问题:
|
||||
1. 宽泛拦截(以前): 手持任意方块右键"任何功能方块"就取消放置 -> 正常放置失效
|
||||
2. 不拦截: 手持南瓜派右键盘子时, 原版先触发"吃/放"前摇, 由服务端取消就"闪一下"
|
||||
因此只对下面明确列出的组合拦截, 其余一律放行。
|
||||
|
||||
【集合】
|
||||
ITEM_USE_ON_CANCEL : set of (手持item, 被点block) 仅这两者匹配才取消
|
||||
ITEM_USE_ON_CANCEL_BY_ITEM : set of 手持item 只看手持item即可取消
|
||||
BLOCK_USE_CANCEL : set of 被右键的block 右键这些功能方块提前cancel
|
||||
================================================================================
|
||||
"""
|
||||
|
||||
# ============================================================================
|
||||
# 一、精确组合: (手持item, 被点block) -> 两者都匹配才取消
|
||||
# ============================================================================
|
||||
|
||||
# ---- 盘子装盘 (YuanbanService PLATE_RULES) ----
|
||||
PLATE_CANCEL = {
|
||||
("minecraft:pumpkin_pie", "rtdd:plate_0"),
|
||||
("minecraft:cod", "rtdd:plate_0"),
|
||||
("minecraft:salmon", "rtdd:plate_0"),
|
||||
("minecraft:tropical_fish", "rtdd:plate_0"),
|
||||
("minecraft:fish", "rtdd:plate_0"),
|
||||
("minecraft:melon_slice", "rtdd:plate_0"),
|
||||
("minecraft:bread", "rtdd:plate_0"),
|
||||
("minecraft:cookie", "rtdd:plate_0"),
|
||||
("minecraft:cooked_chicken", "rtdd:plate_0"),
|
||||
}
|
||||
|
||||
# ---- 面食.甜食手持转换 (Mianshi ITEM_USE_ON_RULES) ----
|
||||
MIANSHI_CANCEL = {
|
||||
("rtdd:dought_7", "rtdd:oven"),
|
||||
("rtdd:farineblock_1", "rtdd:bowlasoup"),
|
||||
("rtdd:dumplings_4", "rtdd:steamer"),
|
||||
("rtdd:roubaozi_3", "rtdd:steamer"),
|
||||
("rtdd:bamboo_4", "rtdd:steamer"),
|
||||
("rtdd:plate_34", "rtdd:steamer"),
|
||||
}
|
||||
|
||||
# ---- 汤锅手持转换 (Tangguo ITEM_USE_ON_RULES) ----
|
||||
TANGGUO_CANCEL = {
|
||||
("rtdd:mushroomsoup", "rtdd:noodle_soup"),
|
||||
("rtdd:vegetablesoup", "rtdd:noodle_soup"),
|
||||
("rtdd:eggsoup", "rtdd:noodle_soup"),
|
||||
}
|
||||
|
||||
# ---- 炒锅 盖饭双重转换 (Chaoguo ITEM_USE_ON_RULES) ----
|
||||
# 正向: 手持成品菜 -> 右键 米饭三形态 (米饭在物品/方块双向, 以方块被点为准)
|
||||
CHAOGUO_CANCEL = {
|
||||
("rtdd:plate_47", "rtdd:bowlofrice"),
|
||||
("rtdd:plate_47", "rtdd:bowlofrice_2"),
|
||||
("rtdd:plate_47", "rtdd:bowlofrice_3"),
|
||||
("rtdd:plate_54", "rtdd:bowlofrice"),
|
||||
("rtdd:plate_54", "rtdd:bowlofrice_2"),
|
||||
("rtdd:plate_54", "rtdd:bowlofrice_3"),
|
||||
("rtdd:plate_32", "rtdd:bowlofrice"),
|
||||
("rtdd:plate_32", "rtdd:bowlofrice_2"),
|
||||
("rtdd:plate_32", "rtdd:bowlofrice_3"),
|
||||
("rtdd:plate_15", "rtdd:bowlofrice"),
|
||||
("rtdd:plate_15", "rtdd:bowlofrice_2"),
|
||||
("rtdd:plate_15", "rtdd:bowlofrice_3"),
|
||||
# 反向: 手持米饭 -> 右键 成品菜方块
|
||||
("rtdd:bowlofrice", "rtdd:plate_47"),
|
||||
("rtdd:bowlofrice_2", "rtdd:plate_47"),
|
||||
("rtdd:bowlofrice_3", "rtdd:plate_47"),
|
||||
("rtdd:bowlofrice", "rtdd:plate_54"),
|
||||
("rtdd:bowlofrice_2", "rtdd:plate_54"),
|
||||
("rtdd:bowlofrice_3", "rtdd:plate_54"),
|
||||
("rtdd:bowlofrice", "rtdd:plate_32"),
|
||||
("rtdd:bowlofrice_2", "rtdd:plate_32"),
|
||||
("rtdd:bowlofrice_3", "rtdd:plate_32"),
|
||||
("rtdd:bowlofrice", "rtdd:plate_15"),
|
||||
("rtdd:bowlofrice_2", "rtdd:plate_15"),
|
||||
("rtdd:bowlofrice_3", "rtdd:plate_15"),
|
||||
}
|
||||
|
||||
# ---- 厨具 锅铲/带油锅铲 (Chuju) ----
|
||||
CHUJU_CANCEL = {
|
||||
("rtdd:spatula", "rtdd:oilcan"),
|
||||
("rtdd:spatula_oil", "rtdd:oilcan"),
|
||||
("rtdd:spatula_oil", "rtdd:wok"),
|
||||
}
|
||||
|
||||
# ---- 寿司: 手持寿司方块物品 右键 自家寿司方块 (取消默认放置) ----
|
||||
# 被点block为寿司方块时, 手持任何寿司方块物品都取消放置(意图是堆叠/取走/转换)
|
||||
SUSHI_BLOCKS = {
|
||||
"rtdd:sushi_0", "rtdd:sushi_1",
|
||||
"rtdd:codsushi_1", "rtdd:codsushi_2", "rtdd:codsushi_3",
|
||||
"rtdd:codsushi_4", "rtdd:codsushi_5", "rtdd:codsushi_6",
|
||||
"rtdd:salmonsushi_1", "rtdd:salmonsushi_2", "rtdd:salmonsushi_3",
|
||||
"rtdd:salmonsushi_4", "rtdd:salmonsushi_5", "rtdd:salmonsushi_6",
|
||||
"rtdd:fishsushi_1", "rtdd:fishsushi_2", "rtdd:fishsushi_3",
|
||||
"rtdd:fishsushi_4", "rtdd:fishsushi_5", "rtdd:fishmonsushi_6",
|
||||
"rtdd:nigirisushi",
|
||||
"rtdd:sushipile_0", "rtdd:sushipile_1", "rtdd:sushipile_2",
|
||||
"rtdd:sushipile_3", "rtdd:sushipile_4", "rtdd:sushipile_5",
|
||||
"rtdd:nigirisushifishcod", "rtdd:nigirisushicod_2", "rtdd:nigirisushicod_3",
|
||||
"rtdd:nigirisushifishsalmon_1", "rtdd:nigirisushisalnom_2", "rtdd:nigirisushisalnom_3",
|
||||
"rtdd:nigirisushifish_1", "rtdd:nigirisushifish_2", "rtdd:nigirisushifish_3",
|
||||
"rtdd:squid_sushi", "rtdd:squidsushi_2", "rtdd:squidsushi_3",
|
||||
}
|
||||
SUSHI_CANCEL = set(
|
||||
(held, block) for held in SUSHI_BLOCKS for block in SUSHI_BLOCKS
|
||||
)
|
||||
|
||||
# ---- 裹粉 (Shicai COATING_RULES): 手持生食材右键 面粉块 (取消默认放置) ----
|
||||
COATING_ITEMS = {
|
||||
"rtdd:sashimi", # 生鱼片
|
||||
"rtdd:lobster", # 龙虾
|
||||
"minecraft:porkchop", # 生猪肉
|
||||
"minecraft:chicken", # 生鸡肉
|
||||
"minecraft:potato", # 生土豆
|
||||
}
|
||||
COATING_CANCEL = set(
|
||||
(item, "rtdd:farineblock_3") for item in COATING_ITEMS
|
||||
)
|
||||
|
||||
# ---- 汇总精确组合 ----
|
||||
ITEM_USE_ON_CANCEL = (PLATE_CANCEL | MIANSHI_CANCEL | TANGGUO_CANCEL
|
||||
| CHAOGUO_CANCEL | CHUJU_CANCEL | SUSHI_CANCEL
|
||||
| COATING_CANCEL)
|
||||
|
||||
# ============================================================================
|
||||
# 二、纯手持物品取消: 只看手持item (右键任意方块表面/空中)
|
||||
# ============================================================================
|
||||
|
||||
# ---- 原版相邻放置 (YuanbanService ITEM_USE_ON_RULES) ----
|
||||
PLACE_ITEMS = {
|
||||
"minecraft:chicken",
|
||||
"minecraft:salmon",
|
||||
"minecraft:cod",
|
||||
"minecraft:fish",
|
||||
"minecraft:carrot",
|
||||
"minecraft:potato",
|
||||
"rtdd:qingcai",
|
||||
"rtdd:scallions",
|
||||
}
|
||||
|
||||
# ---- 总食用 手持直接吃 (Shiyongfood TRY_USE_RULES) ----
|
||||
EAT_ITEMS = {
|
||||
"rtdd:rice_balls", # 饭团
|
||||
"rtdd:boiled_egg", # 水煮蛋
|
||||
"rtdd:beancurd", # 豆腐
|
||||
}
|
||||
|
||||
ITEM_USE_ON_CANCEL_BY_ITEM = PLACE_ITEMS | EAT_ITEMS
|
||||
|
||||
# ============================================================================
|
||||
# 三、右键功能方块集合 (ClientBlockUseEvent 提前 cancel)
|
||||
# 右键这些功能方块, 无论空手/手持, 客户端都提前取消"默认交互",
|
||||
# 由服务端 OnBlockUse 精确路由处理(不误伤放置)。
|
||||
# 注意: 仅列出"交互型"功能方块(灶台/蒸笼/炒锅/汤锅/锅具/柴火/水箱等),
|
||||
# 不放被右键时应当正常放置的方块。
|
||||
# ============================================================================
|
||||
BLOCK_USE_CANCEL = {
|
||||
"rtdd:stove", "rtdd:stove_1", "rtdd:stove_2",
|
||||
"rtdd:steamer", "rtdd:steamercover",
|
||||
"rtdd:wok", "rtdd:coverthepan", "rtdd:oilpan",
|
||||
"rtdd:stewedsoup", "rtdd:stewedsoupwater", "rtdd:coverthepot",
|
||||
"rtdd:oilpot_0", "rtdd:oilpot_1",
|
||||
"rtdd:oilcan",
|
||||
"rtdd:manger_0", "rtdd:manger_1", "rtdd:manger_2", "rtdd:manger_3",
|
||||
"rtdd:pigmanger_1", "rtdd:pigmanger_2",
|
||||
"rtdd:chickenmanger_0", "rtdd:chickenmanger_1",
|
||||
"rtdd:firewood", "rtdd:firewood_2",
|
||||
"rtdd:stonemill",
|
||||
"rtdd:beater", "rtdd:beatermeat_0", "rtdd:beatermeat_1",
|
||||
"rtdd:beatermike_0", "rtdd:beatermike_1", "rtdd:beatermike_2",
|
||||
"rtdd:beater_custard_0", "rtdd:beater_custard_1", "rtdd:beater_custard_2",
|
||||
"rtdd:beater_eggsandmilk_0", "rtdd:beater_eggsandmilk_1", "rtdd:beater_eggsandmilk_2",
|
||||
}
|
||||
Reference in new issue
Block a user