家具实现 2

This commit is contained in:
wenhe committed 2026-09-03 15:42:11 +08:00
1 parent 1413a3abc6
commit 0cb1da680d
4 files changed
+133 -81

No files matched your search

@@ -57,7 +57,9 @@ blockEntityDataComp = comp.CreateBlockEntityData(LevelId)
gameComp = comp.CreateGame(LevelId)
# ---- 只导入家具家私自己的数据库 ----
from ..FurnitureData import FURNITURE_SWITCHES
from ..FurnitureData import (FURNITURE_SWITCHES,
KITCHENRACK_BLOCKS, KITCHENWARE_ITEMS,
KITCHENRACK_SINGLE_BLOCK, KITCHENRACK_COMBO_BLOCK)
# ---- 统一分发器 ----
from ...service.FeatureDispatcher import FeatureDispatcher
@@ -82,12 +84,15 @@ class FurnitureService(BlueFoxServerSystem):
# ---- 构建规则字典(O(1) 查找) ----
self.furnitureRecipes = {}
self.furnitureBlockSet = set()
self.furnitureBlockSet = set(KITCHENRACK_BLOCKS) # 厨具架通用逻辑, 单独注册
for sw in FURNITURE_SWITCHES:
key = (sw["source"], sw.get("item"))
self.furnitureRecipes[key] = sw
self.furnitureBlockSet.add(sw["source"])
# ---- 厨具架方块集合(通用组合逻辑用) ----
self.kitchenrackBlockSet = set(KITCHENRACK_BLOCKS)
# ---- 右键冷却表 ----
self.cooldown = {}
@@ -122,6 +127,14 @@ class FurnitureService(BlueFoxServerSystem):
key = (dim, x, y, z)
itemDict = self.getCarriedItem(playerId)
itemName = itemDict.get("newItemName") if itemDict else None
# 厨具架: 通用组合逻辑(顺序无关, 后放先取), 单独处理
if blockName in self.kitchenrackBlockSet:
if not self.checkCooldown(key, 0.5):
return True
self._handleKitchenRack(playerId, pos, dim, itemDict, itemName)
return True
recipe = self.findRecipe(blockName, itemDict)
if not recipe:
@@ -268,7 +281,61 @@ class FurnitureService(BlueFoxServerSystem):
playerId, "§a取回了 %d 只箭" % retCount)
# ============================================================================
# 四、切换型规则处理(水槽/盘子架/书柜/厨具架/唱片机/垃圾桶)
# 四、厨具架通用逻辑(组合由 stack 记录计算, 与放入顺序无关, 取回后放先取)
# ============================================================================
def _handleKitchenRack(self, playerId, pos, dim, itemDict, itemName):
"""
厨具架:放入/取回通用处理。
放入: 手持 锅铲/锅勺/菜刀/炒锅 右键空架/单件架 -> 按组合(顺序无关)成型
取回: 空手右键 -> 弹出最后放入的厨具并返还, 形态退回剩余单件/空
"""
record = self._loadRecord(pos, dim)
stack = record["stack"] if record else []
# ---- 取回: 空手 ----
if not itemName or itemName == "minecraft:air":
if not stack:
return
topItem = stack.pop()
self.giveItemObj(playerId, topItem)
if stack:
target = KITCHENRACK_SINGLE_BLOCK.get(
stack[0]["itemName"], "rtdd:kitchenwarerack")
else:
target = "rtdd:kitchenwarerack"
self.replaceBlock(pos, dim, target, playerId)
if stack:
self._saveRecordDelayed(pos, dim, {"stack": stack})
else:
self._clearRecord(pos, dim)
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a取回了厨具")
return
# ---- 放入: 手持厨具 ----
if itemName not in KITCHENWARE_ITEMS:
return
if len(stack) >= 2:
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§c厨具架已满!")
return
# 计算组合目标方块(顺序无关: 先放A再放B == 先放B再放A)
newItems = [s["itemName"] for s in stack] + [itemName]
if len(newItems) == 1:
target = KITCHENRACK_SINGLE_BLOCK.get(newItems[0])
else:
target = KITCHENRACK_COMBO_BLOCK.get(tuple(sorted(newItems)))
if not target:
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§c这个搭配放不上厨具架!")
return
# 消耗1个, 压栈并替换
self.consumeItem(playerId, itemDict, 1)
stack.append(self._toItemObj(itemDict))
self.replaceBlock(pos, dim, target, playerId)
self._saveRecordDelayed(pos, dim, {"stack": stack})
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a放上了厨具")
# ============================================================================
# 五、切换型规则处理(水槽/盘子架/书柜/唱片机/垃圾桶)
# ============================================================================
def handleSwitch(self, recipe, playerId, pos, dim, itemDict, key):