家具实现 2
This commit is contained in:
1 parent
1413a3abc6
commit
0cb1da680d
4 files changed
+133
-81
No files matched your search
+48
-68
@@ -59,6 +59,9 @@ FLUME_RULES = [
|
||||
{"source": "rtdd:flume_1", "item": "minecraft:bucket",
|
||||
"target": "rtdd:flume_0", "consume": 1,
|
||||
"giveItem": "minecraft:water_bucket", "tip": "§a取走了水, 水桶装满水"},
|
||||
# 满水空手右键 -> 直接放空(倒掉水)
|
||||
{"source": "rtdd:flume_1", "item": None,
|
||||
"target": "rtdd:flume_0", "tip": "§a水槽已放空"},
|
||||
# 放脏盘子(需满水)
|
||||
{"source": "rtdd:flume_1", "item": "rtdd:plate_0a",
|
||||
"target": "rtdd:flume_2", "consume": 1, "tip": "§a放入1个脏盘子"},
|
||||
@@ -68,15 +71,15 @@ FLUME_RULES = [
|
||||
"target": "rtdd:flume_4", "consume": 1, "tip": "§a放入1个脏盘子"},
|
||||
{"source": "rtdd:flume_4", "item": "rtdd:plate_0a",
|
||||
"target": "rtdd:flume_5", "consume": 1, "tip": "§a放入1个脏盘子"},
|
||||
# 取脏盘子
|
||||
# 取脏盘子(洗好取出的是 盘子 rtdd:plate_0)
|
||||
{"source": "rtdd:flume_5", "item": None,
|
||||
"target": "rtdd:flume_4", "giveItem": "rtdd:plate_0a", "tip": "§a取回1个脏盘子"},
|
||||
"target": "rtdd:flume_4", "giveItem": "rtdd:plate_0", "tip": "§a取回1个盘子"},
|
||||
{"source": "rtdd:flume_4", "item": None,
|
||||
"target": "rtdd:flume_3", "giveItem": "rtdd:plate_0a", "tip": "§a取回1个脏盘子"},
|
||||
"target": "rtdd:flume_3", "giveItem": "rtdd:plate_0", "tip": "§a取回1个盘子"},
|
||||
{"source": "rtdd:flume_3", "item": None,
|
||||
"target": "rtdd:flume_2", "giveItem": "rtdd:plate_0a", "tip": "§a取回1个脏盘子"},
|
||||
"target": "rtdd:flume_2", "giveItem": "rtdd:plate_0", "tip": "§a取回1个盘子"},
|
||||
{"source": "rtdd:flume_2", "item": None,
|
||||
"target": "rtdd:flume_1", "giveItem": "rtdd:plate_0a", "tip": "§a取回1个脏盘子"},
|
||||
"target": "rtdd:flume_0", "giveItem": "rtdd:plate_0", "tip": "§a取回最后1个盘子"},
|
||||
]
|
||||
|
||||
# ============================================================
|
||||
@@ -158,70 +161,48 @@ for _i in range(len(_BOOKCASE_CHAIN) - 1, 0, -1):
|
||||
})
|
||||
|
||||
# ============================================================
|
||||
# 五、厨具架 (kitchenwarerack, 至多挂2件, 方块状态即组合, 纯切换)
|
||||
# 五、厨具架 (kitchenwarerack, 至多挂2件)
|
||||
# 组合由方块状态+stack记录决定, 与放入顺序无关, 取回后放先取。
|
||||
# 通用逻辑在 FurnitureService._handleKitchenRack, 这里只放常量。
|
||||
# 可放: 锅铲(spatula) / 锅勺(potandspoon) / 菜刀(cleaver) / 炒锅(wok)
|
||||
# ============================================================
|
||||
KITCHENRACK_RULES = [
|
||||
# ---- 放入 (空架 -> 单件) ----
|
||||
{"source": "rtdd:kitchenwarerack", "item": "rtdd:spatula",
|
||||
"target": "rtdd:kitchenwareracka_1", "consume": 1, "tip": "§a放上了锅铲"},
|
||||
{"source": "rtdd:kitchenwarerack", "item": "rtdd:potandspoon",
|
||||
"target": "rtdd:kitchenwarerackb_1", "consume": 1, "tip": "§a放上了锅勺"},
|
||||
{"source": "rtdd:kitchenwarerack", "item": "rtdd:cleaver",
|
||||
"target": "rtdd:kitchenwarerackd_1", "consume": 1, "tip": "§a放上了菜刀"},
|
||||
{"source": "rtdd:kitchenwarerack", "item": "rtdd:wok",
|
||||
"target": "rtdd:kitchenwarerackc_1", "consume": 1, "tip": "§a放上了炒锅"},
|
||||
# ---- 放入 (单件 -> 双件/组合) ----
|
||||
{"source": "rtdd:kitchenwareracka_1", "item": "rtdd:spatula",
|
||||
"target": "rtdd:kitchenwareracka_2", "consume": 1, "tip": "§a再放上一把锅铲"},
|
||||
{"source": "rtdd:kitchenwareracka_1", "item": "rtdd:potandspoon",
|
||||
"target": "rtdd:kitchenwareracka_3", "consume": 1, "tip": "§a放上了锅勺"},
|
||||
{"source": "rtdd:kitchenwarerackb_1", "item": "rtdd:potandspoon",
|
||||
"target": "rtdd:kitchenwarerackb_2", "consume": 1, "tip": "§a再放上一把锅勺"},
|
||||
{"source": "rtdd:kitchenwarerackc_1", "item": "rtdd:cleaver",
|
||||
"target": "rtdd:kitchenwarerackc_2", "consume": 1, "tip": "§a放上了菜刀"},
|
||||
{"source": "rtdd:kitchenwarerackd_1", "item": "rtdd:cleaver",
|
||||
"target": "rtdd:kitchenwarerackd_3", "consume": 1, "tip": "§a再放上一把菜刀"},
|
||||
{"source": "rtdd:kitchenwarerackd_1", "item": "rtdd:spatula",
|
||||
"target": "rtdd:kitchenwarerackd_2", "consume": 1, "tip": "§a放上了锅铲"},
|
||||
{"source": "rtdd:kitchenwarerackd_1", "item": "rtdd:potandspoon",
|
||||
"target": "rtdd:kitchenwarerackd_4", "consume": 1, "tip": "§a放上了锅勺"},
|
||||
# ---- 取回 (空手右键, 掉落对应厨具) ----
|
||||
{"source": "rtdd:kitchenwareracka_1", "item": None,
|
||||
"target": "rtdd:kitchenwarerack",
|
||||
"dropItem": [{"name": "rtdd:spatula", "count": 1}], "tip": "§a取回了锅铲"},
|
||||
{"source": "rtdd:kitchenwareracka_2", "item": None,
|
||||
"target": "rtdd:kitchenwareracka_1",
|
||||
"dropItem": [{"name": "rtdd:spatula", "count": 1}], "tip": "§a取回了一把锅铲"},
|
||||
{"source": "rtdd:kitchenwareracka_3", "item": None,
|
||||
"target": "rtdd:kitchenwareracka_1",
|
||||
"dropItem": [{"name": "rtdd:potandspoon", "count": 1}], "tip": "§a取回了锅勺"},
|
||||
{"source": "rtdd:kitchenwarerackb_1", "item": None,
|
||||
"target": "rtdd:kitchenwarerack",
|
||||
"dropItem": [{"name": "rtdd:potandspoon", "count": 1}], "tip": "§a取回了锅勺"},
|
||||
{"source": "rtdd:kitchenwarerackb_2", "item": None,
|
||||
"target": "rtdd:kitchenwarerackb_1",
|
||||
"dropItem": [{"name": "rtdd:potandspoon", "count": 1}], "tip": "§a取回了一把锅勺"},
|
||||
{"source": "rtdd:kitchenwarerackc_1", "item": None,
|
||||
"target": "rtdd:kitchenwarerack",
|
||||
"dropItem": [{"name": "rtdd:wok", "count": 1}], "tip": "§a取回了炒锅"},
|
||||
{"source": "rtdd:kitchenwarerackc_2", "item": None,
|
||||
"target": "rtdd:kitchenwarerackc_1",
|
||||
"dropItem": [{"name": "rtdd:cleaver", "count": 1}], "tip": "§a取回了菜刀"},
|
||||
{"source": "rtdd:kitchenwarerackd_1", "item": None,
|
||||
"target": "rtdd:kitchenwarerack",
|
||||
"dropItem": [{"name": "rtdd:cleaver", "count": 1}], "tip": "§a取回了菜刀"},
|
||||
{"source": "rtdd:kitchenwarerackd_2", "item": None,
|
||||
"target": "rtdd:kitchenwarerackd_1",
|
||||
"dropItem": [{"name": "rtdd:spatula", "count": 1}], "tip": "§a取回了锅铲"},
|
||||
{"source": "rtdd:kitchenwarerackd_3", "item": None,
|
||||
"target": "rtdd:kitchenwarerackd_1",
|
||||
"dropItem": [{"name": "rtdd:cleaver", "count": 1}], "tip": "§a取回了一把菜刀"},
|
||||
{"source": "rtdd:kitchenwarerackd_4", "item": None,
|
||||
"target": "rtdd:kitchenwarerackd_1",
|
||||
"dropItem": [{"name": "rtdd:potandspoon", "count": 1}], "tip": "§a取回了锅勺"},
|
||||
KITCHENRACK_BLOCKS = [
|
||||
"rtdd:kitchenwarerack", # 厨具架(空)
|
||||
"rtdd:kitchenwareracka_1", # 单锅铲
|
||||
"rtdd:kitchenwareracka_2", # 双锅铲
|
||||
"rtdd:kitchenwareracka_3", # 锅铲+锅勺
|
||||
"rtdd:kitchenwarerackb_1", # 单锅勺
|
||||
"rtdd:kitchenwarerackb_2", # 双锅勺
|
||||
"rtdd:kitchenwarerackc_1", # 单炒锅
|
||||
"rtdd:kitchenwarerackc_2", # 炒锅+菜刀
|
||||
"rtdd:kitchenwarerackd_1", # 单菜刀
|
||||
"rtdd:kitchenwarerackd_2", # 菜刀+锅铲
|
||||
"rtdd:kitchenwarerackd_3", # 双菜刀
|
||||
"rtdd:kitchenwarerackd_4", # 菜刀+锅勺
|
||||
]
|
||||
|
||||
# 可上架的厨具物品
|
||||
KITCHENWARE_ITEMS = ("rtdd:spatula", "rtdd:potandspoon", "rtdd:cleaver", "rtdd:wok")
|
||||
|
||||
# 单件 -> 对应方块
|
||||
KITCHENRACK_SINGLE_BLOCK = {
|
||||
"rtdd:spatula": "rtdd:kitchenwareracka_1",
|
||||
"rtdd:potandspoon": "rtdd:kitchenwarerackb_1",
|
||||
"rtdd:wok": "rtdd:kitchenwarerackc_1",
|
||||
"rtdd:cleaver": "rtdd:kitchenwarerackd_1",
|
||||
}
|
||||
|
||||
# 双件组合(sorted) -> 对应方块, 顺序无关(先放A再放B == 先放B再放A)
|
||||
KITCHENRACK_COMBO_BLOCK = {
|
||||
("rtdd:potandspoon", "rtdd:spatula"): "rtdd:kitchenwareracka_3", # 锅铲+锅勺
|
||||
("rtdd:cleaver", "rtdd:wok"): "rtdd:kitchenwarerackc_2", # 炒锅+菜刀
|
||||
("rtdd:cleaver", "rtdd:spatula"): "rtdd:kitchenwarerackd_2", # 菜刀+锅铲
|
||||
("rtdd:cleaver", "rtdd:potandspoon"): "rtdd:kitchenwarerackd_4", # 菜刀+锅勺
|
||||
("rtdd:spatula", "rtdd:spatula"): "rtdd:kitchenwareracka_2", # 双锅铲
|
||||
("rtdd:potandspoon", "rtdd:potandspoon"): "rtdd:kitchenwarerackb_2", # 双锅勺
|
||||
("rtdd:cleaver", "rtdd:cleaver"): "rtdd:kitchenwarerackd_3", # 双菜刀
|
||||
}
|
||||
|
||||
# ============================================================
|
||||
# 六、古式唱片机 (b_108 无碟 / b_109 有碟)
|
||||
# 放入: 手持任意原版唱片 -> 有碟, 消耗1, 记录唱片(rtdd_disc)
|
||||
@@ -259,8 +240,7 @@ TRASHBIN_RULES = [
|
||||
]
|
||||
|
||||
# ============================================================
|
||||
# 汇总: 家具家私全部右键转换规则
|
||||
# 汇总: 家具家私右键转换规则(厨具架为通用逻辑, 不在规则表, 单独注册)
|
||||
# ============================================================
|
||||
FURNITURE_SWITCHES = (ARROWBARREL_RULES + FLUME_RULES + TRAYRACKS_RULES
|
||||
+ BOOKCASE_RULES + KITCHENRACK_RULES
|
||||
+ RECORDPLAYER_RULES + TRASHBIN_RULES)
|
||||
+ BOOKCASE_RULES + RECORDPLAYER_RULES + TRASHBIN_RULES)
|
||||
+70
-3
@@ -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):
|
||||
|
||||
Reference in new issue
Block a user