原版熟食物品放置 (keyong)

This commit is contained in:
wenhe committed 2026-09-03 17:30:18 +08:00
1 parent 620500ab45
commit 38f2ff2b33
7 files changed
+117 -27

No files matched your search

@@ -3,24 +3,29 @@
================================================================================
原版放置分类转换规则数据
================================================================================
统一管理"手持原版物品右键方块表面 → 放置对应方块"的规则(ServerItemUseOnEvent)。
统一管理"手持原版物品右键方块表面"的规则(ServerItemUseOnEvent)。
从各功能分类中剔除出来单独成目录, 避免散落在各处。
当前规则:
【一、相邻空格放置】(ITEM_USE_ON_RULES) —— 手持原版物品右键任意方块表面, 在相邻空格放置方块
1) 原版生鸡肉(minecraft:chicken) → 生鸡肉(放置后) roastchickenplace_0 [烧烤用]
2) 原版生鲑鱼(minecraft:salmon) → 死鲑鱼 killfish_0 [死亡生物用]
3) 原版生鳕鱼(minecraft:cod) → 死鳕鱼 killcod_0 [死亡生物用]
4) minecraft:fish → 死鳕鱼 killcod_0 (网易端 ItemUseOn 事件对
生鳕鱼报的 itemName 是 minecraft:fish, 与 GetPlayerItem 的 minecraft:cod 不同)
【二、盘子转换】(PLATE_RULES) —— 手持原版食物右键 空盘子(rtdd:plate_0),
盘子本身变为对应成品盘 (乡野食物·原版食物 分类, 与上面的相邻放置不同, 是替换被右键方块)
字段说明:
item: 手持的原版物品
source: 被右键的方块(盘子转换用, 必须匹配才替换)
target: 放置成的方块
consume: 消耗数量(默认1)
tip: 放置成功提示
tip: 转换成功提示
================================================================================
"""
# ---- 一、相邻空格放置 ----
ITEM_USE_ON_RULES = [
{
"item": "minecraft:chicken", # 原版生鸡肉
@@ -49,3 +54,26 @@ ITEM_USE_ON_RULES = [
"tip": "§a已放置死鳕鱼",
},
]
# ---- 二、盘子转换: 手持原版食物右键 空盘子(plate_0), 盘子变为对应成品盘 ----
# 生鱼片(plate_17)可用 鳕鱼/鲑鱼/热带鱼 右键(含网易端鳕鱼报 minecraft:fish 的兼容)
PLATE_RULES = [
{"item": "minecraft:pumpkin_pie", "source": "rtdd:plate_0",
"target": "rtdd:plate_16", "consume": 1, "tip": "§a南瓜派装盘了"},
{"item": "minecraft:cod", "source": "rtdd:plate_0",
"target": "rtdd:plate_17", "consume": 1, "tip": "§a生鱼片装盘了"},
{"item": "minecraft:salmon", "source": "rtdd:plate_0",
"target": "rtdd:plate_17", "consume": 1, "tip": "§a生鱼片装盘了"},
{"item": "minecraft:tropical_fish", "source": "rtdd:plate_0",
"target": "rtdd:plate_17", "consume": 1, "tip": "§a生鱼片装盘了"},
{"item": "minecraft:fish", "source": "rtdd:plate_0",
"target": "rtdd:plate_17", "consume": 1, "tip": "§a生鱼片装盘了"},
{"item": "minecraft:melon_slice", "source": "rtdd:plate_0",
"target": "rtdd:plate_18", "consume": 1, "tip": "§a西瓜装盘了"},
{"item": "minecraft:bread", "source": "rtdd:plate_0",
"target": "rtdd:plate_20", "consume": 1, "tip": "§a面包装盘了"},
{"item": "minecraft:cookie", "source": "rtdd:plate_0",
"target": "rtdd:plate_21", "consume": 1, "tip": "§a曲奇装盘了"},
{"item": "minecraft:cooked_chicken", "source": "rtdd:plate_0",
"target": "rtdd:plate_4", "consume": 1, "tip": "§a熟鸡肉装盘了"},
]
@@ -36,7 +36,7 @@ from ....BlueFoxTools.SpecialFunciton.BlueFoxSystem import BlueFoxServerSystem
from ....BlueFoxTools.ToolsConfig import LevelId
# ---- 只导入原版放置自己的数据库 ----
from ..YuanbanData import ITEM_USE_ON_RULES
from ..YuanbanData import ITEM_USE_ON_RULES, PLATE_RULES
# ---- 统一分发器 ----
from ...service.FeatureDispatcher import FeatureDispatcher
@@ -73,6 +73,11 @@ class YuanbanService(BlueFoxServerSystem):
for rule in ITEM_USE_ON_RULES:
self.itemUseOnRecipes[rule["item"]] = rule
# ---- 构建盘子转换规则字典(手持原版食物右键空盘子 → 成品盘) ----
self.plateRecipes = {}
for rule in PLATE_RULES:
self.plateRecipes[rule["item"]] = rule
# ---- 右键冷却表 ----
self.cooldown = {}
@@ -88,25 +93,57 @@ class YuanbanService(BlueFoxServerSystem):
return set()
def getItemUseOnRules(self):
"""返回"手持物品右键方块表面"的规则: {物品名: 规则dict}"""
return self.itemUseOnRecipes
"""返回"手持物品右键方块表面"的规则: 相邻放置+盘子转换的物品名合集
(分发器只按物品名路由到本类, 值随意)"""
rules = {}
for k in self.itemUseOnRecipes:
rules[k] = True
for k in self.plateRecipes:
rules[k] = True
return rules
def handleItemUseOn(self, args):
"""
由 FeatureDispatcher 转发的"手持物品右键方块表面"事件。
在方块表面放置对应方块(生鸡肉/死鲑鱼/死鳕鱼)。
两种模式:
1. 盘子转换: 手持原版食物右键 空盘子(plate_0) → 盘子本身变为对应成品盘
2. 相邻空格放置: 手持原版生鸡肉/鲑鱼/鳕鱼右键任意方块表面 → 相邻空格放置对应方块
返回 True=已处理,False=当前组合无匹配规则。
"""
itemName = args.get("itemName")
# ServerItemUseOnEvent 的玩家键是 entityId,不是 playerId
playerId = args.get("playerId") or args.get("entityId")
rule = self.itemUseOnRecipes.get(itemName)
if not rule:
return False
x, y, z = args.get("x"), args.get("y"), args.get("z")
face = args.get("face", 1)
dim = comp.CreateDimension(playerId).GetEntityDimensionId()
pos = (x, y, z)
# ---- 优先: 盘子转换(右键的必须是空盘子) ----
plateRule = self.plateRecipes.get(itemName)
if plateRule:
try:
cur = comp.CreateBlockInfo(LevelId).GetBlockNew(pos, dim)
except Exception:
cur = None
if cur and cur.get("name") == plateRule.get("source"):
key = (dim, x, y, z)
if not self.checkCooldown(key, 0.5):
return True
itemDict = self.getCarriedItem(playerId)
if not itemDict:
return False
self.consumeItem(playerId, itemDict, plateRule.get("consume", 1))
# 直接替换被右键的盘子方块
self.replaceBlock(pos, dim, plateRule["target"], playerId)
if plateRule.get("tip"):
comp.CreateMsg(playerId).NotifyOneMessage(playerId, plateRule["tip"])
return True
# 被右键的不是盘子 → 交给下面的相邻放置处理
# ---- 相邻空格放置 ----
rule = self.itemUseOnRecipes.get(itemName)
if not rule:
return False
# 计算被点方块表面相邻的目标格
off = FACE_OFFSET.get(face, (0, 1, 0))
@@ -144,8 +181,9 @@ class YuanbanService(BlueFoxServerSystem):
def getCarriedItem(self, playerId):
itemComp = comp.CreateItem(playerId)
# getUserData=True 必须传, 否则取不到 userData(消耗堆叠物品时保留)
return itemComp.GetPlayerItem(
serverApi.GetMinecraftEnum().ItemPosType.CARRIED, 0)
serverApi.GetMinecraftEnum().ItemPosType.CARRIED, 0, True)
# ============================================================================
# 三、工具方法:消耗物品
@@ -165,7 +203,8 @@ class YuanbanService(BlueFoxServerSystem):
serverApi.GetMinecraftEnum().ItemPosType.CARRIED,
{"itemName": itemDict["newItemName"],
"count": itemDict["count"],
"auxValue": itemDict.get("newAuxValue", 0)})
"auxValue": itemDict.get("newAuxValue", 0),
"userData": itemDict.get("userData", {})})
# ============================================================================
# 四、工具方法:替换方块