Files
rtdd/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/yinliao/YinliaoData.py
T
2026-09-30 12:54:42 +08:00

162 lines
9.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- 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"})