Files
rtdd/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/jiaju/FurnitureData.py
T

357 lines
18 KiB
Python

# -*- coding: utf-8 -*-
"""
================================================================================
家具家私分类转换规则数据
================================================================================
统一管理"家具家私"(xy_furniture) 分类下的全部【右键切换型】转换规则:
箭桶、水槽、盘子架、书柜、厨具架、古式唱片机、垃圾桶。
全部为即时右键转换, 无计时, 不需要 TimerService。
由 xiangyemod/jiaju/service/FurnitureService 处理, 注册到 FeatureDispatcher。
【规则字段说明】
source: 被右键的源方块
item: 手持物品名; None=空手; "*music_disc"=任意原版唱片;
"*arrow"=任意箭; "*any"=任意非空物品
target: 转换成的目标方块
consume: 消耗数量(默认0, 即不消耗)
clearHand: True=清空主手全部物品(垃圾桶扔垃圾)
giveItem: 取回/取水时给玩家的物品名
(统一优先级: 背包同名堆叠 -> 主手(空) -> 背包空位 -> 掉落)
dropItem: 取回时给的物品列表 [{"name": "xx", "count": N}]
(与 giveItem 同走统一优先级, 空间不足才掉出来)
record: "count"=记录一种物品+数量(箭桶) / "stack"=后放先取堆栈(书柜),
记录写入方块实体数据(rtdd_swt/rtdd_swc/rtdd_swi/rtdd_swa/rtdd_sws),
退出重进不丢; 附魔以扁平ench字段([[附魔ID,等级],...])存储,
不存含__type__/__value__的userData(引擎写不进方块实体)
maxCount: record 类型最大容量(箭桶32 / 书柜13)
arrowMode:"store"=箭桶存箭(批量) / "retrieve"=箭桶取箭(一次性全取)
discPut: True=唱片机放入时把唱片写入方块实体(取回时原样返还)
discGet: True=唱片机取回时从方块实体读出唱片并掉落
tip: 转换成功提示
================================================================================
"""
# ============================================================
# 一、箭桶 (arrowbarrel_0 无箭 / arrowbarrel_1 有箭)
# 存箭: 手持箭(普通箭/药水箭)右键, 批量存入手中所有箭, 至多32只,
# 只存一种箭(类型+药水效果aux不符不能混存), count记录
# 取箭: 空手右键, 一次性取回方块记录的全部箭
# ============================================================
ARROWBARREL_RULES = [
{"source": "rtdd:arrowbarrel_0", "item": "*arrow",
"target": "rtdd:arrowbarrel_1", "arrowMode": "store",
"record": "count", "maxCount": 32,
"tip": None},
{"source": "rtdd:arrowbarrel_1", "item": None,
"target": "rtdd:arrowbarrel_0", "arrowMode": "retrieve",
"record": "count",
"tip": None},
]
# ============================================================
# 二、水槽 (flume_0~5)
# 加水: 空手右键空槽 -> 满水
# 取水: 手持空水桶右键满水 -> 空槽 + 给装满水的水桶
# 放脏盘子(脏盘子 rtdd:plate_0a): 满水起, 逐个放入最多4个
# 取脏盘子: 空手右键逐个取回
# ============================================================
FLUME_RULES = [
# 加水/取水
{"source": "rtdd:flume_0", "item": None,
"target": "rtdd:flume_1", "tip": None},
{"source": "rtdd:flume_1", "item": "minecraft:bucket",
"target": "rtdd:flume_0", "consume": 1,
"giveItem": "minecraft:water_bucket", "tip": None},
# 满水空手右键 -> 直接放空(倒掉水)
{"source": "rtdd:flume_1", "item": None,
"target": "rtdd:flume_0", "tip": None},
# 放脏盘子(需满水)
{"source": "rtdd:flume_1", "item": "rtdd:plate_0a",
"target": "rtdd:flume_2", "consume": 1, "tip": None},
{"source": "rtdd:flume_2", "item": "rtdd:plate_0a",
"target": "rtdd:flume_3", "consume": 1, "tip": None},
{"source": "rtdd:flume_3", "item": "rtdd:plate_0a",
"target": "rtdd:flume_4", "consume": 1, "tip": None},
{"source": "rtdd:flume_4", "item": "rtdd:plate_0a",
"target": "rtdd:flume_5", "consume": 1, "tip": None},
# 取脏盘子(洗好取出的是 盘子 rtdd:plate_0)
{"source": "rtdd:flume_5", "item": None,
"target": "rtdd:flume_4", "giveItem": "rtdd:plate_0", "tip": None},
{"source": "rtdd:flume_4", "item": None,
"target": "rtdd:flume_3", "giveItem": "rtdd:plate_0", "tip": None},
{"source": "rtdd:flume_3", "item": None,
"target": "rtdd:flume_2", "giveItem": "rtdd:plate_0", "tip": None},
{"source": "rtdd:flume_2", "item": None,
"target": "rtdd:flume_0", "giveItem": "rtdd:plate_0", "tip": None},
]
# ============================================================
# 三、盘子架 (trayracks_1 空 ~ trayracks_6 五个)
# 放盘子(盘子 rtdd:plate_0): 逐个放入最多5个
# 取盘子: 空手右键逐个取回
# ============================================================
TRAYRACKS_RULES = [
{"source": "rtdd:trayracks_1", "item": "rtdd:plate_0",
"target": "rtdd:trayracks_2", "consume": 1, "tip": None},
{"source": "rtdd:trayracks_2", "item": "rtdd:plate_0",
"target": "rtdd:trayracks_3", "consume": 1, "tip": None},
{"source": "rtdd:trayracks_3", "item": "rtdd:plate_0",
"target": "rtdd:trayracks_4", "consume": 1, "tip": None},
{"source": "rtdd:trayracks_4", "item": "rtdd:plate_0",
"target": "rtdd:trayracks_5", "consume": 1, "tip": None},
{"source": "rtdd:trayracks_5", "item": "rtdd:plate_0",
"target": "rtdd:trayracks_6", "consume": 1, "tip": None},
{"source": "rtdd:trayracks_6", "item": None,
"target": "rtdd:trayracks_5", "giveItem": "rtdd:plate_0", "tip": None},
{"source": "rtdd:trayracks_5", "item": None,
"target": "rtdd:trayracks_4", "giveItem": "rtdd:plate_0", "tip": None},
{"source": "rtdd:trayracks_4", "item": None,
"target": "rtdd:trayracks_3", "giveItem": "rtdd:plate_0", "tip": None},
{"source": "rtdd:trayracks_3", "item": None,
"target": "rtdd:trayracks_2", "giveItem": "rtdd:plate_0", "tip": None},
{"source": "rtdd:trayracks_2", "item": None,
"target": "rtdd:trayracks_1", "giveItem": "rtdd:plate_0", "tip": None},
]
# ============================================================
# 三b、碗柜 (cupboard_0 空 ~ cupboard_3 三个碗)
# 放碗(木碗 rtdd:bowlasoup): 手持木碗右键逐个放入, 最多3个
# 取碗: 空手右键逐个取回
# ============================================================
CUPBOARD_RULES = [
{"source": "rtdd:cupboard_0", "item": "rtdd:bowlasoup",
"target": "rtdd:cupboard_1", "consume": 1, "tip": None},
{"source": "rtdd:cupboard_1", "item": "rtdd:bowlasoup",
"target": "rtdd:cupboard_2", "consume": 1, "tip": None},
{"source": "rtdd:cupboard_2", "item": "rtdd:bowlasoup",
"target": "rtdd:cupboard_3", "consume": 1, "tip": None},
{"source": "rtdd:cupboard_3", "item": "rtdd:bowlasoup",
"tip": "§c碗柜已满!"},
{"source": "rtdd:cupboard_3", "item": None,
"target": "rtdd:cupboard_2", "dropItem": [{"name": "rtdd:bowlasoup", "count": 1}],
"tip": None},
{"source": "rtdd:cupboard_2", "item": None,
"target": "rtdd:cupboard_1", "dropItem": [{"name": "rtdd:bowlasoup", "count": 1}],
"tip": None},
{"source": "rtdd:cupboard_1", "item": None,
"target": "rtdd:cupboard_0", "dropItem": [{"name": "rtdd:bowlasoup", "count": 1}],
"tip": None},
]
# ============================================================
# 四、书柜 (bookcase 系列, 后放先取, 至多13本)
# 放书(书 minecraft:book / 附魔书 minecraft:enchanted_book): 逐个放入,
# stack记录完整物品信息(附魔书附魔不丢)
# 取书: 空手右键, 后放先取(LIFO)
# 方块链: 书柜_1(空)=bookcase, 书柜_2(1本)=bookcase_12, 书柜_3(2本)=bookcase_11,
# 书柜_4(3本)=bookcase_10, 书柜_5(4本)=bookcase_9, 书柜_6(5本)=bookcase_8,
# 书柜_7(6本)=bookcase_7, 书柜_8(7本)=bookcase_6, 书柜_9(8本)=bookcase_5,
# 书柜_10(9本)=bookcase_4, 书柜_11(10本)=b_196, 书柜_12(11本)=bookcase_3,
# 书柜_13(12本)=bookcase_2, 书柜_14(13本)=bookcase_1
# ============================================================
_BOOKCASE_CHAIN = [
"rtdd:bookcase", # 书柜_1(空)
"rtdd:bookcase_12", # 书柜_2(1本)
"rtdd:bookcase_11", # 书柜_3(2本)
"rtdd:bookcase_10", # 书柜_4(3本)
"rtdd:bookcase_9", # 书柜_5(4本)
"rtdd:bookcase_8", # 书柜_6(5本)
"rtdd:bookcase_7", # 书柜_7(6本)
"rtdd:bookcase_6", # 书柜_8(7本)
"rtdd:bookcase_5", # 书柜_9(8本)
"rtdd:bookcase_4", # 书柜_10(9本)
"rtdd:b_196", # 书柜_11(10本)
"rtdd:bookcase_3", # 书柜_12(11本)
"rtdd:bookcase_2", # 书柜_13(12本)
"rtdd:bookcase_1", # 书柜_14(13本)
]
BOOKCASE_RULES = []
# 放入: 第 i 级 -> 第 i+1 级, 书/附魔书, 消耗1, stack记录
for _i in range(len(_BOOKCASE_CHAIN) - 1):
_src, _dst = _BOOKCASE_CHAIN[_i], _BOOKCASE_CHAIN[_i + 1]
BOOKCASE_RULES.append({
"source": _src, "item": "minecraft:book", "target": _dst,
"consume": 1, "record": "stack", "maxCount": 13,
"tip": None,
})
BOOKCASE_RULES.append({
"source": _src, "item": "minecraft:enchanted_book", "target": _dst,
"consume": 1, "record": "stack", "maxCount": 13,
"tip": None,
})
# 取回: 第 i 级 -> 第 i-1 级, 空手, 后放先取
for _i in range(len(_BOOKCASE_CHAIN) - 1, 0, -1):
_src, _dst = _BOOKCASE_CHAIN[_i], _BOOKCASE_CHAIN[_i - 1]
BOOKCASE_RULES.append({
"source": _src, "item": None, "target": _dst,
"record": "stack", "tip": None,
})
# ============================================================
# 四b、药水架 (lotion 系列, 后放先取, 至多3瓶)
# 放药水(任意药水: 普通/喷溅/滞留 minecraft:potion/splash_potion/lingering_potion):
# 逐个放入, 消耗1瓶, stack记录物品名+aux(aux决定药水效果)
# 取药水: 空手右键, 后放先取(LIFO), 原样返还该瓶药水
# 方块链: 药水架_1(空)=lotion_0, 药水架_2(一瓶)=lotion_1,
# 药水架_3(两瓶)=lotion_2, 药水架_4(三瓶)=lotion_3
# ============================================================
_POTIONRACK_CHAIN = [
"rtdd:lotion_0", # 药水架_1(空)
"rtdd:lotion_1", # 药水架_2(一瓶)
"rtdd:lotion_2", # 药水架_3(两瓶)
"rtdd:lotion_3", # 药水架_4(三瓶)
]
POTIONRACK_RULES = []
# 放入: 第 i 级 -> 第 i+1 级, 任意药水, 消耗1, stack记录
for _i in range(len(_POTIONRACK_CHAIN) - 1):
_src, _dst = _POTIONRACK_CHAIN[_i], _POTIONRACK_CHAIN[_i + 1]
POTIONRACK_RULES.append({
"source": _src, "item": "*potion", "target": _dst,
"consume": 1, "record": "stack", "maxCount": 3,
"tip": None,
})
# 取回: 第 i 级 -> 第 i-1 级, 空手, 后放先取
for _i in range(len(_POTIONRACK_CHAIN) - 1, 0, -1):
_src, _dst = _POTIONRACK_CHAIN[_i], _POTIONRACK_CHAIN[_i - 1]
POTIONRACK_RULES.append({
"source": _src, "item": None, "target": _dst,
"record": "stack", "tip": None,
})
# 满架: 手持药水右键三瓶满的药水架 -> 提示已满, 拦截默认行为(防止误喝药水)
POTIONRACK_RULES.append({
"source": "rtdd:lotion_3", "item": "*potion",
"tip": "§c药水架已满!",
})
# ============================================================
# 五、厨具架 (kitchenwarerack, 至多挂2件)
# 组合由方块状态+stack记录决定, 与放入顺序无关, 取回后放先取。
# 通用逻辑在 FurnitureService._handleKitchenRack, 这里只放常量。
# 可放: 锅铲(spatula) / 锅勺(potandspoon) / 菜刀(cleaver) / 炒锅(wok)
# ============================================================
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", # 双菜刀
}
# 方块状态 -> 厨具物品列表(名称即组合, 顺序按方块名从左到右, 最后一件=后放入)
# 用于"无记录"时推断(如创造模式直接放置带厨具的厨具架), 取回按此顺序后放先取
KITCHENRACK_BLOCK_ITEMS = {
"rtdd:kitchenwarerack": [], # 空
"rtdd:kitchenwareracka_1": ["rtdd:spatula"], # 单锅铲
"rtdd:kitchenwareracka_2": ["rtdd:spatula", "rtdd:spatula"], # 双锅铲
"rtdd:kitchenwareracka_3": ["rtdd:spatula", "rtdd:potandspoon"], # 锅铲+锅勺
"rtdd:kitchenwarerackb_1": ["rtdd:potandspoon"], # 单锅勺
"rtdd:kitchenwarerackb_2": ["rtdd:potandspoon", "rtdd:potandspoon"], # 双锅勺
"rtdd:kitchenwarerackc_1": ["rtdd:wok"], # 单炒锅
"rtdd:kitchenwarerackc_2": ["rtdd:wok", "rtdd:cleaver"], # 炒锅+菜刀
"rtdd:kitchenwarerackd_1": ["rtdd:cleaver"], # 单菜刀
"rtdd:kitchenwarerackd_2": ["rtdd:spatula", "rtdd:cleaver"], # 菜刀+锅铲(左铲右刀)
"rtdd:kitchenwarerackd_3": ["rtdd:cleaver", "rtdd:cleaver"], # 双菜刀
"rtdd:kitchenwarerackd_4": ["rtdd:potandspoon", "rtdd:cleaver"], # 菜刀+锅勺(左勺右刀)
}
# ============================================================
# 六、古式唱片机 (b_108 无碟 / b_109 有碟)
# 放入: 手持任意原版唱片 -> 有碟, 消耗1, 记录唱片(rtdd_disc)
# 取回: 空手右键 -> 无碟 + 原样返还唱片
# 注: 放入后播放曲目为 todo, 后续实现
# ============================================================
RECORDPLAYER_RULES = [
{"source": "rtdd:b_108", "item": "*music_disc",
"target": "rtdd:b_109", "consume": 1, "discPut": True,
"tip": None},
{"source": "rtdd:b_109", "item": None,
"target": "rtdd:b_108", "discGet": True,
"tip": None},
]
# ============================================================
# 七、垃圾桶 (storage_buckets 关闭 / rubbish_bin_2 打开 / b_160 有垃圾)
# 打开: 右键垃圾桶(空手/手持均可) -> 打开桶盖(不消耗)
# 扔垃圾: 打开时手持任意物品右键 -> 有垃圾 + 清空主手
# 关闭: 右键(空手/手持均可) 打开/有垃圾 -> 关闭
# ============================================================
TRASHBIN_RULES = [
{"source": "rtdd:storage_buckets", "item": None,
"target": "rtdd:rubbish_bin_2", "tip": None},
{"source": "rtdd:storage_buckets", "item": "*any",
"target": "rtdd:rubbish_bin_2", "tip": None},
{"source": "rtdd:rubbish_bin_2", "item": None,
"target": "rtdd:storage_buckets", "tip": None},
{"source": "rtdd:rubbish_bin_2", "item": "*any",
"target": "rtdd:b_160", "clearHand": True, "tip": None},
{"source": "rtdd:b_160", "item": None,
"target": "rtdd:storage_buckets", "tip": None},
{"source": "rtdd:b_160", "item": "*any",
"target": "rtdd:storage_buckets", "tip": None},
]
# ============================================================
# 七b、壁炉 (b_88 壁炉 / b_89 壁炉(加柴火) / b_90 壁炉(点燃))
# 加柴: 手持木条(rtdd:b_15)右键空壁炉 -> 加柴火, 消耗4个木条
# 点燃: 手持打火石(不消耗)/烈焰弹(消耗1)右键加柴火 -> 点燃
# ============================================================
FIREPLACE_RULES = [
{"source": "rtdd:b_88", "item": "rtdd:b_15",
"target": "rtdd:b_89", "consume": 4, "tip": None},
{"source": "rtdd:b_89", "item": "minecraft:flint_and_steel",
"target": "rtdd:b_90", "tip": None},
{"source": "rtdd:b_89", "item": "minecraft:fire_charge",
"target": "rtdd:b_90", "consume": 1, "tip": None},
]
# ============================================================
# 八、左键破坏存物方块的掉落(书柜/药水架/厨具架)
# 存了东西的方块被左键打碎时, 掉 空方块本体 + 全部存储物品(附魔/药水效果保留)。
# 与售卖盒不同: 破坏后记录随方块一起消失, 重新放置右键取不到东西。
# ============================================================
STORAGE_EMPTY_BLOCK = {}
for _b in _BOOKCASE_CHAIN[1:]: # 书柜_2~14(有书) -> 书柜_1(空)
STORAGE_EMPTY_BLOCK[_b] = _BOOKCASE_CHAIN[0]
for _b in _POTIONRACK_CHAIN[1:]: # 药水架_2~4(有药水) -> 药水架_1(空)
STORAGE_EMPTY_BLOCK[_b] = _POTIONRACK_CHAIN[0]
for _b in KITCHENRACK_BLOCKS[1:]: # 厨具架各形态 -> 厨具架(空)
STORAGE_EMPTY_BLOCK[_b] = KITCHENRACK_BLOCKS[0]
# ============================================================
# 汇总: 家具家私右键转换规则(厨具架为通用逻辑, 不在规则表, 单独注册)
# ============================================================
FURNITURE_SWITCHES = (ARROWBARREL_RULES + FLUME_RULES + TRAYRACKS_RULES
+ CUPBOARD_RULES + BOOKCASE_RULES + POTIONRACK_RULES
+ RECORDPLAYER_RULES + TRASHBIN_RULES + FIREPLACE_RULES)