# -*- 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)