原版熟食物品放置 (keyong)
This commit is contained in:
1 parent
620500ab45
commit
38f2ff2b33
7 files changed
+117
-27
No files matched your search
+49
-10
@@ -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", {})})
|
||||
|
||||
# ============================================================================
|
||||
# 四、工具方法:替换方块
|
||||
|
||||
Reference in new issue
Block a user