右键 改2

This commit is contained in:
wenhe committed 2026-09-22 11:23:32 +08:00
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()
@@ -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 本模块。
@@ -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
@@ -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",
}
@@ -0,0 +1,25 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"0": {
"item": "rtdd:apple_pile",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_apple_pile_unpack"
},
"pattern": [
"0"
],
"result": {
"data": 0,
"item": "minecraft:apple",
"count": 9
},
"tags": [
"crafting_table"
]
}
}
@@ -0,0 +1,25 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"0": {
"item": "rtdd:bread_pile",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_bread_pile_unpack"
},
"pattern": [
"0"
],
"result": {
"data": 0,
"item": "minecraft:bread",
"count": 9
},
"tags": [
"crafting_table"
]
}
}
@@ -0,0 +1,25 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"0": {
"item": "rtdd:carrot_pile",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_carrot_pile_unpack"
},
"pattern": [
"0"
],
"result": {
"data": 0,
"item": "minecraft:carrot",
"count": 9
},
"tags": [
"crafting_table"
]
}
}
@@ -0,0 +1,25 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"0": {
"item": "rtdd:cod_pile",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_cod_pile_unpack"
},
"pattern": [
"0"
],
"result": {
"data": 0,
"item": "minecraft:cod",
"count": 9
},
"tags": [
"crafting_table"
]
}
}
@@ -0,0 +1,25 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"0": {
"item": "rtdd:egg_pile",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_egg_pile_unpack"
},
"pattern": [
"0"
],
"result": {
"data": 0,
"item": "minecraft:egg",
"count": 9
},
"tags": [
"crafting_table"
]
}
}
@@ -0,0 +1,25 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"0": {
"item": "rtdd:orangepile_0",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_orangepile_0_unpack"
},
"pattern": [
"0"
],
"result": {
"data": 0,
"item": "rtdd:orange",
"count": 9
},
"tags": [
"crafting_table"
]
}
}
@@ -0,0 +1,25 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"0": {
"item": "rtdd:peachpile_0",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_peachpile_0_unpack"
},
"pattern": [
"0"
],
"result": {
"data": 0,
"item": "rtdd:peach",
"count": 9
},
"tags": [
"crafting_table"
]
}
}
@@ -0,0 +1,35 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"0": {
"item": "rtdd:plate_0",
"data": 0
},
"1": {
"item": "rtdd:nigirisushifish_3",
"data": 0
},
"2": {
"item": "rtdd:fishsushi_5",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_plate_27"
},
"pattern": [
"0",
"1",
"2"
],
"result": {
"data": 0,
"item": "rtdd:plate_27",
"count": 1
},
"tags": [
"crafting_table"
]
}
}
@@ -0,0 +1,35 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"0": {
"item": "rtdd:plate_0",
"data": 0
},
"1": {
"item": "rtdd:nigirisushicod_3",
"data": 0
},
"2": {
"item": "rtdd:codsushi_5",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_plate_28"
},
"pattern": [
"0",
"1",
"2"
],
"result": {
"data": 0,
"item": "rtdd:plate_28",
"count": 1
},
"tags": [
"crafting_table"
]
}
}
@@ -0,0 +1,35 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"0": {
"item": "rtdd:plate_0",
"data": 0
},
"1": {
"item": "rtdd:nigirisushisalnom_3",
"data": 0
},
"2": {
"item": "rtdd:salmonsushi_5",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_plate_29"
},
"pattern": [
"0",
"1",
"2"
],
"result": {
"data": 0,
"item": "rtdd:plate_29",
"count": 1
},
"tags": [
"crafting_table"
]
}
}
@@ -0,0 +1,35 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"0": {
"item": "rtdd:plate_0",
"data": 0
},
"1": {
"item": "rtdd:squidsushi_3",
"data": 0
},
"2": {
"item": "rtdd:fishsushi_5",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_plate_42"
},
"pattern": [
"0",
"1",
"2"
],
"result": {
"data": 0,
"item": "rtdd:plate_42",
"count": 1
},
"tags": [
"crafting_table"
]
}
}
@@ -0,0 +1,25 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"0": {
"item": "rtdd:potato_pile",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_potato_pile_unpack"
},
"pattern": [
"0"
],
"result": {
"data": 0,
"item": "minecraft:potato",
"count": 9
},
"tags": [
"crafting_table"
]
}
}
@@ -0,0 +1,25 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"0": {
"item": "rtdd:salmon_pile",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_salmon_pile_unpack"
},
"pattern": [
"0"
],
"result": {
"data": 0,
"item": "minecraft:salmon",
"count": 9
},
"tags": [
"crafting_table"
]
}
}
+16
View File
@@ -956,3 +956,19 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher)
面食补 蒸牛奶鸡蛋(steamermilkandegg); 死亡生物修正 挂鱼晾干钩(meathookcoddry)
为"空手右键取鱼干"并补挂肉架_3/4 [已实现]
########################################
【右键拦截白名单化 + 客户端拦截】2026-09-22
########################################
- 问题: 原 OnItemUseOn 有宽泛兜底"手持方块物品右键任意功能方块且无 itemUseOn
服务就 ret=True 取消默认放置", 导致正常放置失效。
- 修复: ①删除该宽泛兜底, 服务端只处理真正注册了 itemUseOn 的组合, 其余放行 → 放置恢复
②新增共享白名单 InterceptData.py(客户端/服务端同一份): PLATE_CANCEL装盘/
MIANSHI_CANCEL面食/ TANGGUO_CANCEL汤锅/ CHAOGUO_CANCEL盖饭双向/
CHUJU_CANCEL锅铲油罐炒锅/ SUSHI_CANCEL寿司堆叠/ COATING_CANCEL裹粉/
PLACE_ITEMS原版相邻放置/ EAT_ITEMS手持直接吃/ BLOCK_USE_CANCEL右键功能方块
③新增 ClientFeatureDispatcher.py(继承 BlueFoxClientSystem): 监听
ClientBlockUseEvent(cancel功能方块)/ ClientItemUseOnEvent(ret白名单组合)/
ClientItemTryUseEvent(cancel手持吃物品), 客户端提前拦截消除"闪一下"
④modMain.py 客户端分支导入 ClientFeatureDispatcher, 由 BlueFox 框架自动注册 [已实现]
+138
View File
@@ -0,0 +1,138 @@
========================================
右键拦截白名单清单(手持 item 右键 功能方块)
(供"客户端拦截 + 白名单精确化"改造参考,审核稿)
========================================
说明:
- 本清单列出所有"手持物品右键某个功能方块"时, 需要【取消该物品默认行为
(右键吃/放置)】、改由模组处理的 精确 (手持item, 被点block) 组合。
- 目标是"精确白名单, 不误伤": 只有以下组合会在客户端提前 cancel/ret,
其余手持物品右键任何方块一律放行, 正常放置回归。
- 来源: 逐服务从代码中已注册的 itemUseOnRules 自动提取。
【分类】
一、原版放置(相邻空格放置, 手持原版物品右键任意表面 -> 放置到相邻格)
- 这类其实不强依赖"被点方块", 但右键时会触发原版"放置前摇";
客户端拦截 key = 手持item(不做被点block限制), 取消后由服务端放块。
二、盘子装盘(手持原版食物右键 空盘子 plate_0 -> 盘子变换)
三、面食.甜食 手持转换(右键 烤炉/木碗/蒸笼)
四、汤锅 手持转换(右键 熟面条碗)
五、炒锅 盖饭转换(手持成品菜右键 米饭/米饭右键 成品菜)
六、乡野食材 裹粉(手持生食材右键 面粉块)
七、厨具 锅铲/带油锅铲(右键 油罐/炒锅)
八、乡野自然 水稻种植(手持稻谷右键地面/水)
九、寿司 手持方块物品右键自家寿司方块(取消默认放置)
十、总食用 手持直接吃物品(饭团/水煮蛋/豆腐)
========================================
一、原版放置 (YuanbanService ITEM_USE_ON_RULES)
========================================
右键场景: 手持原版/自定义生食材 右键 任意方块表面 -> 在相邻空格放置切配块/生肉。
取消key: 手持item (客户端不限制被点block, 仅知道要取消放置, 由服务端落块)
- minecraft:chicken -> 放置 生鸡肉(放置后) roastchickenplace_0
- minecraft:salmon -> 放置 死鲑鱼 killfish_0
- minecraft:cod -> 放置 死鳕鱼 killcod_0
- minecraft:fish(网易兼容) -> 放置 死鳕鱼 killcod_0
- minecraft:carrot -> 放置 切胡萝卜 cutcarrot_0
- minecraft:potato -> 放置 切土豆 cutpotato_0
- rtdd:qingcai(青菜) -> 放置 切青菜 cutvegetable_0
- rtdd:scallions(葱) -> 放置 葱花_1 cutscallions_1
========================================
二、盘子装盘 (YuanbanService PLATE_RULES)
========================================
右键场景: 手持原版食物 右键 空盘子(rtdd:plate_0) -> 盘子变为对应成品盘。
取消key: (手持item, 被点block=rtdd:plate_0)
- minecraft:pumpkin_pie + plate_0 -> plate_16 (南瓜派盘)
- minecraft:cod + plate_0 -> plate_17 (生鱼片盘)
- minecraft:salmon + plate_0 -> plate_17
- minecraft:tropical_fish + plate_0 -> plate_17
- minecraft:fish(网易) + plate_0 -> plate_17
- minecraft:melon_slice + plate_0 -> plate_18 (西瓜盘)
- minecraft:bread + plate_0 -> plate_20 (面包盘)
- minecraft:cookie + plate_0 -> plate_21 (曲奇盘)
- minecraft:cooked_chicken + plate_0 -> plate_4 (熟鸡肉盘)
========================================
三、面食.甜食 (Mianshi ITEM_USE_ON_RULES)
========================================
右键场景: 手持半成品 右键 烤炉/木碗/蒸笼。
取消key: (手持item, 被点block)
- rtdd:dought_7(生面饼) + OVEN(rtdd:oven) -> 烤炉上方放置 馍 roujiamo_0
- rtdd:farineblock_1(面粉加鸡蛋) + BOWL(rtdd:bowlasoup木碗)
-> 木碗变 蛋糕面糊(生) cakebatterblock_0
- rtdd:dumplings_4(生饺子) + STEAMER(rtdd:steamer) -> 蒸笼变 蒸饺子(生) steamerdumplings_0, 计时
- rtdd:roubaozi_3(生肉包子) + STEAMER -> 蒸笼变 蒸包子(生) baozilong_1, 计时
- rtdd:bamboo_4(竹筒加肉) + STEAMER -> 蒸笼变 竹筒饭(生) bamboo_6, 计时
- rtdd:plate_34(蛋液半成品) + STEAMER -> 蒸笼变 蒸牛奶鸡蛋 steamermilkandegg, 计时
========================================
四、汤锅 (Tangguo ITEM_USE_ON_RULES)
========================================
右键场景: 手持锅态汤方块 右键 熟面条碗(noodle_soup) -> 面条碗变对应汤面。
取消key: (手持item, 被点block=rtdd:noodle_soup)
- 蘑菇汤(rtdd:mushroomsoup) -> mushroomnoodles(香菇面)
- 蔬菜汤(rtdd:vegetablesoup) -> vegetable_noodles(蔬菜面)
- 蛋花汤(rtdd:eggsoup) -> noodles_1(蛋花面)
- (该表还被组装成 胡萝卜牛肉汤等 熟品 -> 各汤面, 见 ITEM_USE_ON_RULES)
========================================
五、炒锅 盖饭 (Chaoguo ITEM_USE_ON_RULES)
========================================
右键场景: 双向转换(手持成品菜右键米饭 / 手持米饭右键成品菜)。
取消key: 手持item + 被点block 双向都要取消默认放置。
正向(手持成品菜 -> 右键 米饭 bowlofrice/2/3):
- 辣子鸡丁(plate_47) -> 辣子鸡丁盖饭(全份) plate_48
- 香菇滑鸡(plate_54) -> 香菇滑鸡盖饭(全份) plate_55
- 麻婆豆腐(plate_32) -> 麻婆豆腐盖饭 plate_56
- 胡萝卜炒鳕鱼(plate_15) -> 鳕鱼盖饭 plate_50
反向(手持米饭 bowlofrice/2/3 -> 右键上述成品菜方块):
- 米饭三形态 右键 辣子鸡丁plate_47/香菇滑鸡plate_54/麻婆豆腐plate_32/胡萝卜炒鳕鱼plate_15
被点方块原地变对应盖饭
========================================
六、乡野食材 裹粉 (Shicai COATING_RULES)
========================================
右键场景: 手持生食材 右键 面粉块(farineblock_3) -> 裹粉。
取消key: 手持item + 被点block=rtdd:farineblock_3
- rtdd:sashimi(生鱼片) 等裹粉食材(具体清单见 ShicaiData.COATING_RULES)
========================================
七、厨具 (Chuju 锅铲/带油锅铲)
========================================
右键场景: 手持锅铲 右键 油罐/炒锅。
取消key:
- rtdd:spatula(锅铲) + rtdd:oilcan(油罐) -> 锅铲变带油锅铲, 油罐次数-1
- rtdd:spatula_oil(带油锅铲) + rtdd:oilcan -> 变回锅铲, 油罐次数+1
- rtdd:spatula_oil(带油锅铲) + rtdd:wok(炒锅) -> 炒锅变炒锅(添油), 油铲变回锅铲
========================================
八、乡野自然 水稻 (Natural RICE_PLANT)
========================================
右键场景: 手持稻谷 右键 水面/地面 -> 种植水稻。
取消key: 手持item=rtdd:rice_seeds(稻谷)
========================================
九、寿司 (Shousi)
========================================
右键场景: 手持寿司方块物品 右键 自家寿司方块 -> 取消默认放置(意图是堆叠/转换)。
取消key: 手持item=全部寿司方块物品 + 被点block=自家寿司方块
- 卷寿司/手握/寿司堆 等全部 sushiBlockItems 右键 自家方块
========================================
十、总食用 手持直接吃 (Shiyongfood TRY_USE_RULES)
========================================
右键场景: 手持物品 右键空中/方块 -> 直接吃(不放置)。
取消key: 手持item (ClientItemTryUseEvent cancel)
- rtdd:rice_balls(饭团) -> 直接吃
- rtdd:boiled_egg(水煮蛋) -> 直接吃
- rtdd:beancurd(豆腐) -> 直接吃