# -*- coding: utf-8 -*- """ ================================================================================ 乡野饮料(xy_drink)转化规则数据 ================================================================================ 所有"乡野饮料"(xy_drink) 分类下的转化规则常量都在这里。 只被 YinliaoService 读取,FeatureDispatcher 通过方块名/物品名 集合路由到对应服务,不会去查其他功能的数据库。 【三大分组】 1) 果汁·榨汁饮品(榨汁机系列 juicer / juicer_0~4) —— 全流程右键转换 果汁由第一步放入的水果决定并【持久化到方块实体数据】, 退出游戏重进后 榨汁完成仍取回正确果汁(详见 YinliaoService._readFruit / _writeFruit)。 2) 冰棍(冰棍盒 icelollybox_1/2 + 各水果盒 icelollyboxb~f) 未定型 → (手持冰块右键) 立即定型 → (手持水果x2) → 各水果盒 → (空手右键) 取出2根冰棍, 还原未定型。 冰棍堆 popsiclepile_2/3: 组合式(苹果冰棍+堆 → 堆2, 空手取回 LIFO)。 3) 冰棍盒·炒冰盒(frytheicebox / frytheicebox_1 + 各水果炒冰盒) 空 → (手持冰块) 放冰 → (手持水果) 炒冰 → (空手右键) 取出冰沙, 还原空。 注: 西瓜炒冰盒可做, 但 西瓜冰沙(melonicecreamplace) 是禁用方块, 无取出规则。 字段说明(与 AnimalData/BarbecueData 一致): 水果物品名 → (成品方块, 名称) 的映射表, 服务端按需读取。 ================================================================================ """ # ============================================================================ # 一、冰块(广义的冰): 原版 冰块/冰砖/蓝冰/霜冰 # 冰棍盒定型、炒冰盒放冰都消耗这几种冰中的任意一种 # ============================================================================ ICE_ITEMS = [ "minecraft:ice", "minecraft:packed_ice", "minecraft:blue_ice", "minecraft:frosted_ice", ] # ============================================================================ # 二、榨汁机(果汁·榨汁饮品) # ============================================================================ # 水果物品名 → (果汁方块, 果汁名) # 西瓜=原版西瓜片 / 橙子=rtdd:orange / 苹果=原版苹果 / 桃子=rtdd:peach / # 葡萄=rtdd:grape / 黄豆=rtdd:soybean(豆浆) JUICE_FRUITS = { "minecraft:melon_slice": ("rtdd:fruitjuice_1", "西瓜汁"), "rtdd:orange": ("rtdd:fruitjuice_2", "橙汁"), "minecraft:apple": ("rtdd:fruitjuice_3", "苹果汁"), "rtdd:peach": ("rtdd:fruitjuice_4", "桃子汁"), "rtdd:grape": ("rtdd:fruitjuice_6", "葡萄汁"), "rtdd:soybean": ("rtdd:fruitjuice_7", "豆浆"), } # 榨汁机状态链(空→放入水果→榨汁中1→2→3→完成), 索引按步骤顺序 JUICER_CHAIN = [ "rtdd:juicer", # 0 榨汁机(空) "rtdd:juicer_0", # 1 榨汁机(放入水果) "rtdd:juicer_1", # 2 榨汁机(榨汁中1) "rtdd:juicer_2", # 3 榨汁机(榨汁中2) "rtdd:juicer_3", # 4 榨汁机(榨汁中3) "rtdd:juicer_4", # 5 榨汁机(完成) ] # 榨汁中逐级右键的提示(juicer_0→1→2→3→4 各阶段) —— 仅保留状态键参与推进逻辑, 提示已静默 JUICER_ADVANCE_TIPS = { "rtdd:juicer_0": None, "rtdd:juicer_1": None, "rtdd:juicer_2": None, "rtdd:juicer_3": None, } # ============================================================================ # 榨汁机·客户端消闪拦截(BlockUse) # 手持 玻璃杯/各水果 右键榨汁机任意状态 时, 客户端需提前取消"放置预览"(避免闪一下), # 再显式通知服务端(见 InterceptData.BLOCKUSE_CANCEL / ClientFeatureDispatcher)。 # 这里只罗列组合, 实际行为仍由服务端 YinliaoService.handleBlockUse 决定 # (放水果/逐级榨汁/玻璃杯取汁)。 # 注意: 不能标 action=="take_out" —— 那会被 BLOCKUSE_CANCEL 派生过滤掉; # 榨汁机取汁走 BlockUse(右击方块)通道, 与汤锅/炒锅/油锅的盛出(ItemUseOn)不同。 # ============================================================================ GLASS_CUP = "rtdd:fruitjuice_0" # 玻璃杯(果汁成品自带杯) JUICER_BLOCKUSE = [] for _it in [GLASS_CUP] + list(JUICE_FRUITS.keys()): for _bk in JUICER_CHAIN: JUICER_BLOCKUSE.append({"item": _it, "block": _bk}) # ============================================================================ # 三、冰棍盒(冰棍) # ============================================================================ # 冰棍盒(未定型) icelollybox_1 → 冰棍盒(定型) icelollybox_2 的直接转换规则: # 手持冰块(广义的冰)右键未定型, 消耗1个冰块, 立即定型(不计时, 与炒冰盒放冰同机制) ICE_LOLLY_FREEZE = { "source": "rtdd:icelollybox_1", "target": "rtdd:icelollybox_2", } # 水果物品名 → (各水果冰棍盒, 冰棍方块, 口味名) # 苹果→icelollyboxc / 桃子→icelollyboxd / 橙子→icelollyboxb / # 葡萄→icelollyboxe / 西瓜→icelollyboxf POPSICLE_FRUITS = { "minecraft:apple": ("rtdd:icelollyboxc", "rtdd:apple_popsicleplace", "苹果"), "rtdd:peach": ("rtdd:icelollyboxd", "rtdd:peach_popsicleplace", "桃子"), "rtdd:orange": ("rtdd:icelollyboxb", "rtdd:orange_popsicle_place", "橙子"), "rtdd:grape": ("rtdd:icelollyboxe", "rtdd:grape_popsicleplace", "葡萄"), "minecraft:melon_slice": ("rtdd:icelollyboxf", "rtdd:melon_popsicleplace", "西瓜"), } # 冰棍盒方块 → (水果物品名, 冰棍方块, 口味名) 反向表(取冰棍用) POPSICLE_BOX_INFO = {v[0]: (k, v[1], v[2]) for k, v in POPSICLE_FRUITS.items()} # 冰棍堆组合(顺序无关, 空手取回按方块状态固定, 不存数据): # 单根 橙子冰棍/西瓜冰棍 放在地上, 手持另一根右键 → 冰棍堆(橙子+西瓜 popsiclepile_2) # (先放橙子再放西瓜 == 先放西瓜再放橙子, 都会变成 冰棍堆(橙子+西瓜)) # 冰棍堆 + 苹果冰棍 → 冰棍堆2(橙子+西瓜+苹果 popsiclepile_3) # 空手右键(按方块状态固定, 无需记录): # - 冰棍堆2 取出 苹果冰棍 → 退回 冰棍堆 # - 冰棍堆 取出 西瓜冰棍 → 变回 单根橙子冰棍 # (其他口味组合暂无对应堆方块, 不支持堆叠) POPSICLE_SINGLE_ORANGE = "rtdd:orange_popsicle_place" # 单根橙子冰棍(放地上) POPSICLE_SINGLE_MELON = "rtdd:melon_popsicleplace" # 单根西瓜冰棍(放地上) POPSICLE_PILE_2 = "rtdd:popsiclepile_2" # 冰棍堆(橙子+西瓜) POPSICLE_PILE_3 = "rtdd:popsiclepile_3" # 冰棍堆2(橙子+西瓜+苹果) POPSICLE_PILE_ADD = "rtdd:apple_popsicleplace" # 第三根(苹果冰棍) # ============================================================================ # 四、炒冰盒(冰棍盒·炒冰盒 分组) # ============================================================================ # 水果物品名 → (各水果炒冰盒, 冰沙方块, 口味名) # 五种口味齐全: 西瓜冰沙(melonicecreamplace) 已从禁用移回乡野饮料, 可正常取出 FRYICE_FRUITS = { "minecraft:apple": ("rtdd:appleicebox", "rtdd:appleicecreamplace", "苹果"), "rtdd:grape": ("rtdd:grapeicebox", "rtdd:grapeicecreamplace", "葡萄"), "minecraft:melon_slice": ("rtdd:melonicebox", "rtdd:melonicecreamplace", "西瓜"), "rtdd:orange": ("rtdd:orangeicebox", "rtdd:orangeicecreamplace", "橘子"), "rtdd:peach": ("rtdd:peachicebox", "rtdd:peachicecreamplace", "桃子"), } # 炒冰盒方块 → (水果物品名, 冰沙方块, 口味名) 反向表(取冰沙用) FRYICE_BOX_INFO = {v[0]: (k, v[1], v[2]) for k, v in FRYICE_FRUITS.items()} # ============================================================================ # 冰棍盒/炒冰盒·客户端消闪拦截(BlockUse) # 这两套"放料"链是内联转换(见 YinliaoService._handleLollyBox / _handleFryIceBox), # 不在 Data 规则表 -> 在此罗列组合, 注册进 InterceptData._BLOCK_USE_TABLES 后自动 # 进入 BLOCKUSE_CANCEL, 由客户端提前 ret + BlockUseRequest 消闪并禁止原版默认行为。 # 为什么必须先拦: # 冰块是可放置方块物品 -> 原版先播"放置"前摇(闪一下); # 水果多为可食用(苹果/西瓜片/rtdd 葡萄/桃子/橙子) -> 原版当"吃"吞掉(一边吃一边放)。 # 组合: # 放冰: 各冰块 × icelollybox_1(冰棍盒未定型) / frytheicebox(炒冰盒空) # 放水果: POPSICLE_FRUITS 各水果 × icelollybox_2(冰棍盒定型) # FRYICE_FRUITS 各水果 × frytheicebox_1(炒冰盒已放冰) # 实际行为仍由服务端 handleBlockUse 决定(消耗1冰/放水果换态)。 # ============================================================================ LOLLY_FRYICE_BLOCKUSE = [] for _ice in ICE_ITEMS: LOLLY_FRYICE_BLOCKUSE.append({"item": _ice, "block": ICE_LOLLY_FREEZE["source"]}) LOLLY_FRYICE_BLOCKUSE.append({"item": _ice, "block": "rtdd:frytheicebox"}) for _fr in POPSICLE_FRUITS: LOLLY_FRYICE_BLOCKUSE.append({"item": _fr, "block": ICE_LOLLY_FREEZE["target"]}) for _fr in FRYICE_FRUITS: LOLLY_FRYICE_BLOCKUSE.append({"item": _fr, "block": "rtdd:frytheicebox_1"})