寿司 功能实现 1

This commit is contained in:
wenhe committed 2026-09-09 16:06:45 +08:00
1 parent 51804de264
commit b82391c5c9
12 files changed
+692 -56

No files matched your search

@@ -17,6 +17,7 @@ from xiangyemod.chuju.service.ChujuTimerService import ChujuTimerService
from xiangyemod.ziran.service.NaturalService import NaturalService
from xiangyemod.ziran.service.NaturalTimerService import NaturalTimerService
from xiangyemod.shicai.service.ShicaiService import ShicaiService
from xiangyemod.shousi.service.ShousiService import ShousiService
if not serverApi.IsInServer():
pass
@@ -0,0 +1,126 @@
# -*- coding: utf-8 -*-
"""
================================================================================
寿司(xy_sushi)转化规则数据
================================================================================
统一管理"寿司"分类下的转化规则常量。只被 ShousiService 读取,
FeatureDispatcher 通过方块名/物品名集合路由到对应服务。
【实现范围(对应 寿司转化关系.txt)】
基础组 : 干海带 + 手持饭团右键 -> 干海带(加饭团), 消耗4个饭团
加鱼 : 干海带(加饭团) + 手持鱼右键 -> 对应寿司(加鱼), 消耗1个
卷制 : 空手右键逐级卷制(四级), 鲑鱼链无"卷_3"标注(成品卷=链尾)
切块 : 手持菜刀右键卷寿司两次 -> 寿司块(三个)
手握组 : 手握普通寿司 + 手持鱼右键 -> 手握X寿司(一个);
手持 手握X寿司(一个) 右键 逐级堆叠到(三个)
寿司堆组: 手持卷寿司右键 -> 寿司堆(两个) -> 寿司堆(三个);
空手右键递减取走, 退回卷寿司
饭团放置: 手持饭团右键方块表面 -> 在表面上方放置 手握普通寿司
(txt 第18条 todo, 手握组起点)
【不实现(txt 明确"后续实现")】
- 吃: 寿司块递减(5/9/13)、手握递减(14~17) 的空手右键吃, 后续实现
- 饭团来源: 汤锅熟米饭捏饭团(属 汤锅 分类, 本次不做)
================================================================================
"""
# ---- 物品 ----
RICE_BALL = "rtdd:rice_balls" # 饭团
CLEAVER_ITEM = "rtdd:cleaver" # 菜刀(刀)
# ---- 鱼物品(手持原料) ----
FISH_COD = "minecraft:cod" # 鳕鱼
FISH_SALMON = "minecraft:salmon" # 鲑鱼
FISH_TROPICAL = "minecraft:tropical_fish" # 热带鱼
FISH_SQUID = "rtdd:rawsquidwhiskersr" # 鱿鱼须(游戏中代表鱿鱼)
# ---- 干海带 ----
NORI_0 = "rtdd:sushi_0" # 干海带
NORI_1 = "rtdd:sushi_1" # 干海带(加饭团), 游戏内名"干海带(加米)"
# ---- 手握普通寿司(手握组起点) ----
NIGIRI_BASE = "rtdd:nigirisushi"
# ============================================================================
# 四组鱼寿司
# roll : 卷链(加鱼 -> 卷_1 -> 卷_2 -> 卷_3 -> 卷_4/成品卷), 空手右键逐级
# cubes : 切块得到的 寿司块(三个)
# nigiri1/2/3 : 手握X寿司(一个/两个/三个)
# pile2/3: 寿司堆(X_两个/X_三个)
# ============================================================================
SUSHI_GROUPS = [
{
"key": "cod",
"fish": FISH_COD,
"roll": ["rtdd:codsushi_1", "rtdd:codsushi_2",
"rtdd:codsushi_3", "rtdd:codsushi_4", "rtdd:codsushi_5"],
"cubes": "rtdd:codsushi_6",
"nigiri1": "rtdd:nigirisushifishcod",
"nigiri2": "rtdd:nigirisushicod_2",
"nigiri3": "rtdd:nigirisushicod_3",
"pile2": "rtdd:sushipile_2",
"pile3": "rtdd:sushipile_3",
"addTip": "§a加上鳕鱼",
"rollTip": "§a鳕鱼寿司卷制中…",
"cutTip": "§a切出了鳕鱼寿司块(三个)",
"nigiriTip": "§a捏成手握鳕鱼寿司",
"pileTip": "§a堆成寿司堆",
"takeTip": "§a取走一个",
},
{
"key": "salmon",
"fish": FISH_SALMON,
"roll": ["rtdd:salmonsushi_1", "rtdd:salmonsushi_2",
"rtdd:salmonsushi_3", "rtdd:salmonsushi_4", "rtdd:salmonsushi_5"],
"cubes": "rtdd:salmonsushi_6",
"nigiri1": "rtdd:nigirisushifishsalmon_1",
"nigiri2": "rtdd:nigirisushisalnom_2",
"nigiri3": "rtdd:nigirisushisalnom_3",
"pile2": "rtdd:sushipile_4",
"pile3": "rtdd:sushipile_5",
"addTip": "§a加上鲑鱼",
"rollTip": "§a鲑鱼寿司卷制中…",
"cutTip": "§a切出了鲑鱼寿司块(三个)",
"nigiriTip": "§a捏成手握鲑鱼寿司",
"pileTip": "§a堆成寿司堆",
"takeTip": "§a取走一个",
},
{
"key": "fish",
"fish": FISH_TROPICAL,
"roll": ["rtdd:fishsushi_1", "rtdd:fishsushi_2",
"rtdd:fishsushi_3", "rtdd:fishsushi_4", "rtdd:fishsushi_5"],
"cubes": "rtdd:fishmonsushi_6",
"nigiri1": "rtdd:nigirisushifish_1",
"nigiri2": "rtdd:nigirisushifish_2",
"nigiri3": "rtdd:nigirisushifish_3",
"pile2": "rtdd:sushipile_0",
"pile3": "rtdd:sushipile_1",
"addTip": "§a加上热带鱼",
"rollTip": "§a热带鱼寿司卷制中…",
"cutTip": "§a切出了热带鱼寿司块(三个)",
"nigiriTip": "§a捏成手握热带鱼寿司",
"pileTip": "§a堆成寿司堆",
"takeTip": "§a取走一个",
},
{
"key": "squid",
"fish": FISH_SQUID,
"roll": None, "cubes": None, "pile2": None, "pile3": None,
"nigiri1": "rtdd:squid_sushi",
"nigiri2": "rtdd:squidsushi_2",
"nigiri3": "rtdd:squidsushi_3",
"addTip": None, "rollTip": None, "cutTip": None,
"nigiriTip": "§a捏成手握鱿鱼寿司",
"pileTip": None, "takeTip": None,
},
]
# 干海带铺饭团消耗数(基础组)
NORI_RICE_CONSUME = 4
# 切块需要菜刀右击次数
CUT_COUNT = 2
# 手握堆叠/寿司堆 每次消耗手持数
STACK_CONSUME = 1
@@ -0,0 +1 @@
# -*- coding: utf-8 -*-
@@ -0,0 +1,341 @@
# -*- coding: utf-8 -*-
"""
================================================================================
寿司(xy_sushi)右键转换引擎(服务端)
================================================================================
处理"寿司"(xy_sushi) 分类下的右键转换:
基础组(干海带铺饭团)、加鱼、卷制、切块、手握(加鱼/堆叠)、
寿司堆(堆叠/递减取走)、饭团放置手握普通寿司(ItemUseOn)。
【事件监听在哪?】
本类【不】监听任何事件!
所有事件由 FeatureDispatcher 统一监听, 按 blockOwner/itemUseOnOwner 路由到本类。
【本类怎么做】
handleBlockUse ← 入口:分发器转发右键方块事件
├─ _handleCut ← 手持菜刀右键卷寿司两次 -> 寿司块(三个)
└─ handleSwitch ← 通用转换(基础组/加鱼/卷制/手握/寿司堆/递减)
handleItemUseOn ← 入口:手持饭团右键方块表面 -> 放置 手握普通寿司
(通用工具) getCarriedItem / consumeItem / giveItem / replaceBlock /
checkCooldown
================================================================================
"""
import time
import mod.server.extraServerApi as serverApi
# ---- 网易API基础对象 ----
ServerSystem = serverApi.GetServerSystemCls() # 服务端系统基类
comp = serverApi.GetEngineCompFactory() # 组件工厂
# ---- 继承 BlueFox 框架的系统基类(提供 CreateEngineItemEntity 等方法) ----
from ....BlueFoxTools.SpecialFunciton.BlueFoxSystem import BlueFoxServerSystem
from ....BlueFoxTools.ToolsConfig import LevelId
# ---- 只导入寿司自己的数据库 ----
from ..ShousiData import (
RICE_BALL, CLEAVER_ITEM,
NORI_0, NORI_1, NIGIRI_BASE,
SUSHI_GROUPS, NORI_RICE_CONSUME, CUT_COUNT, STACK_CONSUME,
)
# ---- 统一分发器 ----
from ...service.FeatureDispatcher import FeatureDispatcher
class ShousiService(BlueFoxServerSystem):
"""
寿司·右键转换引擎
"""
def __init__(self, namespace, systemName):
super(ShousiService, self).__init__(namespace, systemName)
print "===== ShousiService init ====="
# ---- (方块, 手持物品) -> 规则: O(1) 查找 ----
self.recipes = {}
self.featureBlocks = set()
# 1) 基础组: 干海带 + 手持饭团右键 -> 干海带(加饭团), 消耗4个饭团
self.recipes[(NORI_0, RICE_BALL)] = {
"target": NORI_1, "consume": NORI_RICE_CONSUME,
"tip": "§a海苔上铺好了饭团",
}
self.featureBlocks.add(NORI_0)
# 2) 切块映射: 卷寿司(链尾) -> 组(菜刀两次 -> 块三)
self.cutMap = {}
# 3) 逐组构建规则
for g in SUSHI_GROUPS:
roll = g.get("roll")
fish = g.get("fish")
# 卷寿司组(鳕鱼/鲑鱼/热带鱼): 加鱼 -> 卷制 -> 切块 -> 寿司堆
# (鱿鱼组 roll=None, 只有手握组, 无卷寿司/寿司堆)
if roll:
# 加鱼: 干海带(加饭团) + 手持鱼右键 -> 寿司(加鱼), 消耗1个
self.recipes[(NORI_1, fish)] = {
"target": roll[0], "consume": 1, "tip": g.get("addTip"),
}
# 卷制链: 空手右键逐级
for i in range(len(roll) - 1):
self.recipes[(roll[i], None)] = {
"target": roll[i + 1], "tip": g.get("rollTip"),
}
self.featureBlocks.add(roll[i])
# 切块: 卷寿司(链尾) 手持菜刀右键两次 -> 块(三个)
self.cutMap[roll[-1]] = g
self.featureBlocks.add(roll[-1])
# 寿司堆: 手持卷寿司右键 -> 堆(两个) -> 堆(三个), 每级消耗1个
if g.get("pile2"):
self.recipes[(roll[-1], roll[-1])] = {
"target": g["pile2"], "consume": STACK_CONSUME,
"tip": g.get("pileTip"),
}
self.recipes[(g["pile2"], roll[-1])] = {
"target": g["pile3"], "consume": STACK_CONSUME,
"tip": g.get("pileTip"),
}
# 递减: 空手右键, 每级取走一个, 退回卷寿司
self.recipes[(g["pile3"], None)] = {
"target": g["pile2"], "give": roll[-1],
"tip": g.get("takeTip"),
}
self.recipes[(g["pile2"], None)] = {
"target": roll[-1], "give": roll[-1],
"tip": g.get("takeTip"),
}
self.featureBlocks.add(g["pile2"])
self.featureBlocks.add(g["pile3"])
# 手握加鱼: 手握普通寿司 + 手持鱼右键 -> 手握X寿司(一个), 消耗1个
self.recipes[(NIGIRI_BASE, fish)] = {
"target": g["nigiri1"], "consume": 1, "tip": g.get("nigiriTip"),
}
# 手握堆叠: 手持 手握X寿司(一个) 右键 -> (两个) -> (三个), 每级消耗1个
self.recipes[(g["nigiri1"], g["nigiri1"])] = {
"target": g["nigiri2"], "consume": STACK_CONSUME,
"tip": "§a堆叠成两个",
}
self.recipes[(g["nigiri2"], g["nigiri1"])] = {
"target": g["nigiri3"], "consume": STACK_CONSUME,
"tip": "§a堆叠成三个",
}
self.featureBlocks.add(g["nigiri1"])
self.featureBlocks.add(g["nigiri2"])
self.featureBlocks.add(g["nigiri3"])
self.featureBlocks.add(NORI_1)
self.featureBlocks.add(NIGIRI_BASE)
# ---- 切块计数 {(dim,x,y,z): n} ----
self.cutCounter = {}
# ---- 右键冷却表 ----
self.cooldown = {}
# ---- 注册到统一分发器 ----
FeatureDispatcher.register(self)
# ============================================================================
# 一、给 FeatureDispatcher 的接口
# ============================================================================
def getFeatureBlocks(self):
"""返回本功能管辖的所有右键方块名集合"""
return self.featureBlocks
def getItemUseOnRules(self):
"""手持饭团右键方块表面路由(放置手握普通寿司)"""
return {RICE_BALL: True}
def handleBlockUse(self, args):
"""由 FeatureDispatcher 转发的右键方块入口"""
blockName = args.get("blockName")
playerId = args.get("playerId")
x, y, z = args.get("x"), args.get("y"), args.get("z")
pos = (x, y, z)
dim = comp.CreateDimension(playerId).GetEntityDimensionId()
key = (dim, x, y, z)
itemDict = self.getCarriedItem(playerId)
itemName = itemDict.get("newItemName") if itemDict else None
# ---- 切块: 手持菜刀右键卷寿司 ----
if blockName in self.cutMap:
if itemName == CLEAVER_ITEM:
return self._handleCut(blockName, playerId, pos, dim, key)
# ---- 常规转换(基础组/加鱼/卷制/手握/寿司堆/递减) ----
recipe = self.findRecipe(blockName, itemDict)
if not recipe:
return False
if not self.checkCooldown(key, 0.5):
return True
self.handleSwitch(recipe, playerId, pos, dim, itemDict)
return True
def handleItemUseOn(self, args):
"""由 FeatureDispatcher 转发的"手持物品右键方块表面"入口(饭团放置):
手持饭团右键任意非寿司方块表面 -> 在表面上方放置 手握普通寿司。
返回 True=处理了; False=不属本功能管(交还其他服务/默认行为)。"""
itemName = args.get("itemName")
if itemName != RICE_BALL:
return False
playerId = args.get("playerId") or args.get("entityId")
x, y, z = args.get("x"), args.get("y"), args.get("z")
dim = comp.CreateDimension(playerId).GetEntityDimensionId()
# 被点方块若归寿司管辖(干海带/寿司等), 交给方块右键逻辑, 不在此放置
try:
cur = comp.CreateBlockInfo(LevelId).GetBlockNew((x, y, z), dim)
if not cur or cur.get("name") in self.featureBlocks:
return False
except Exception:
return False
# 目标格 = 被点方块上方一格, 必须为空
targetPos = (x, y + 1, z)
try:
cur = comp.CreateBlockInfo(LevelId).GetBlockNew(targetPos, dim)
if cur and cur.get("name") != "minecraft:air":
return False
except Exception:
return False
# 连点冷却
key = (dim, targetPos[0], targetPos[1], targetPos[2])
if not self.checkCooldown(key, 0.5):
return True
# 消耗饭团 + 放置手握普通寿司
itemDict = self.getCarriedItem(playerId)
if not itemDict:
return False
self.consumeItem(playerId, itemDict, 1)
self.replaceBlock(targetPos, dim, NIGIRI_BASE, playerId)
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a摆成手握普通寿司")
return True
# ============================================================================
# 二、规则匹配(精确 + 空手 fallback)
# ============================================================================
def findRecipe(self, blockName, itemDict):
itemName = itemDict.get("newItemName") if itemDict else None
recipe = self.recipes.get((blockName, itemName))
if recipe:
return recipe
if not itemName or itemName == "minecraft:air":
return self.recipes.get((blockName, None))
return None
# ============================================================================
# 三、通用转换执行
# ============================================================================
def handleSwitch(self, recipe, playerId, pos, dim, itemDict):
# 消耗物品
if recipe.get("consume", 0) > 0:
self.consumeItem(playerId, itemDict, recipe["consume"])
# 替换方块
if recipe.get("target"):
self.replaceBlock(pos, dim, recipe["target"], playerId)
# 给背包物品(递减取走)
if recipe.get("give"):
self.giveItem(playerId, recipe["give"])
# 提示
if recipe.get("tip"):
comp.CreateMsg(playerId).NotifyOneMessage(playerId, recipe["tip"])
# ============================================================================
# 四、切块(手持菜刀右键卷寿司两次 -> 寿司块(三个))
# ============================================================================
def _handleCut(self, blockName, playerId, pos, dim, key):
if not self.checkCooldown(key, 0.3):
return True
g = self.cutMap[blockName]
n = self.cutCounter.get(key, 0) + 1
if n >= CUT_COUNT:
self.cutCounter.pop(key, None)
self.replaceBlock(pos, dim, g["cubes"], playerId)
msg = g.get("cutTip") or "§a切好了"
else:
self.cutCounter[key] = n
msg = "§a切寿司中…(%d/%d)" % (n, CUT_COUNT)
comp.CreateMsg(playerId).NotifyOneMessage(playerId, msg)
return True
# ============================================================================
# 五、工具方法:获取玩家主手物品
# ============================================================================
def getCarriedItem(self, playerId):
itemComp = comp.CreateItem(playerId)
return itemComp.GetPlayerItem(
serverApi.GetMinecraftEnum().ItemPosType.CARRIED, 0, True)
# ============================================================================
# 六、工具方法:给玩家物品
# ============================================================================
def giveItem(self, playerId, itemName, count=1, aux=0):
try:
itemDict = {"itemName": itemName, "count": count, "auxValue": aux}
comp.CreateItem(playerId).SpawnItemToPlayerInv(itemDict, playerId)
except Exception:
pass
# ============================================================================
# 七、工具方法:消耗物品
# ============================================================================
def consumeItem(self, playerId, itemDict, amount=1):
if itemDict is None:
return
count = itemDict.get("count", 0)
if count <= amount:
comp.CreateItem(playerId).SetEntityItem(
serverApi.GetMinecraftEnum().ItemPosType.CARRIED,
{"itemName": "minecraft:air", "count": 0, "auxValue": 0})
else:
itemDict["count"] = count - amount
comp.CreateItem(playerId).SetEntityItem(
serverApi.GetMinecraftEnum().ItemPosType.CARRIED,
{"itemName": itemDict["newItemName"],
"count": itemDict["count"],
"auxValue": itemDict.get("newAuxValue", 0),
"userData": itemDict.get("userData", {})})
# ============================================================================
# 八、工具方法:替换方块(保留 aux, 兼容定向变体)
# ============================================================================
def replaceBlock(self, pos, dim, newBlockName, playerId=None):
creator = playerId if playerId is not None else LevelId
aux = 0
try:
oldBlock = comp.CreateBlockInfo(creator).GetBlockNew(pos, dim)
aux = oldBlock.get("aux", 0)
except Exception:
aux = 0
comp.CreateBlockInfo(creator).SetBlockNew(
pos, blockDict={"name": newBlockName, "aux": aux},
oldBlockHandling=0, dimensionId=dim)
# ============================================================================
# 九、工具方法:冷却检查
# ============================================================================
def checkCooldown(self, key, cd=0.5):
now = time.time()
last = self.cooldown.get(key, 0)
if now - last < cd:
return False
self.cooldown[key] = now
return True
@@ -0,0 +1 @@
# -*- coding: utf-8 -*-
@@ -0,0 +1,11 @@
{
"format_version": "1.10",
"minecraft:item": {
"description": {
"identifier": "rtdd:qingcai"
},
"components": {
"minecraft:icon": "qingcai"
}
}
}
File renamed without changes.
+68
View File
@@ -480,3 +480,71 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher)
- 桃子堆/橙子堆: 9满格 (xy_peachpile_0 / xy_orangepile_0) [已实现]
- 食材堆分解(堆放工作台): 9个堆均新增分解配方 xy_*_pile_unpack -> 对应食材x9 [已实现]
########################################
【寿司】(xy_sushi) 2026-09-09
########################################
实现于 xiangyemod/shousi (ShousiData + ShousiService, 注册到 FeatureDispatcher)
+ 盘装寿司 工作台配方 (netease_recipes/xy_plate_27/28/29/42)
(对应 寿司转化关系.txt 一~七组; 方块中文名/英文id 见该 txt 文末【方块清单】)
一、寿司·基础组
- 干海带 -> 干海带(加饭团) [手持 饭团 右键, 消耗4个饭团] [已实现]
机制: 海苔上铺饭团
二、鳕鱼寿司组
- 干海带(加饭团) + 鳕鱼 -> 鳕鱼寿司(加鳕鱼) [手持 鳕鱼 右键, 消耗1个] [已实现]
- 鳕鱼寿司(加鳕鱼) -> 鳕鱼寿司(卷_1) -> 鳕鱼寿司(卷_2) -> 鳕鱼寿司(卷_3) -> 鳕鱼寿司(卷_4)
[空手右键, 逐级卷制, 每卷一级共四级] [已实现]
- 鳕鱼寿司(卷_4) -> 鳕鱼寿司块(三个) [手持 菜刀 右键, 两次] [已实现]
机制: 第一刀"切寿司中…", 第二刀切好, 得 鳕鱼寿司块(三个)
三、鲑鱼寿司组
- 干海带(加饭团) + 鲑鱼 -> 鲑鱼寿司(加鲑鱼) [手持 鲑鱼 右键, 消耗1个] [已实现]
- 鲑鱼寿司(加鲑鱼) -> 鲑鱼寿司(卷_1) -> 鲑鱼寿司(卷_2) -> 鲑鱼寿司(卷_4) -> 鲑鱼寿司(成品卷)
[空手右键, 逐级卷制, 每卷一级共四级] [已实现]
(注: 鲑鱼卷的游戏内卷序命名不整齐, 无"卷_3"标注; 链顺序以转化关系 txt 为准)
- 鲑鱼寿司(成品卷) -> 鲑鱼寿司块(三个) [手持 菜刀 右键, 两次] [已实现]
四、热带鱼寿司组
- 干海带(加饭团) + 热带鱼 -> 热带鱼寿司(加热带鱼) [手持 热带鱼 右键, 消耗1个] [已实现]
- 热带鱼寿司(加热带鱼) -> 热带鱼寿司(卷_1) -> 热带鱼寿司(卷_2) -> 热带鱼寿司(卷_3) -> 热带鱼寿司(卷_4)
[空手右键, 逐级卷制, 每卷一级共四级] [已实现]
- 热带鱼寿司(卷_4) -> 热带鱼寿司块(三个) [手持 菜刀 右键, 两次] [已实现]
五、手握寿司组
- 手握普通寿司来源: 饭团 右键 任意非寿司方块表面 -> 表面上方放置 手握普通寿司, 消耗1个饭团
(txt 第18条 todo, 一并实现, 否则手握组无起点) [已实现]
- 手握普通寿司 + 鳕鱼 -> 手握鳕鱼寿司(一个) [手持 鳕鱼 右键, 消耗1个] [已实现]
- 手握鳕鱼寿司(一个) -> 手握鳕鱼寿司(两个) -> 手握鳕鱼寿司(三个)
[手持 手握鳕鱼寿司(一个) 右键, 逐级堆叠, 每级消耗1个] [已实现]
- 手握普通寿司 + 鲑鱼 -> 手握鲑鱼寿司(一个) [手持 鲑鱼 右键, 消耗1个] [已实现]
- 手握鲑鱼寿司(一个) -> 手握鲑鱼寿司(两个) -> 手握鲑鱼寿司(三个)
[手持 手握鲑鱼寿司(一个) 右键, 逐级堆叠, 每级消耗1个] [已实现]
- 手握普通寿司 + 热带鱼 -> 手握热带鱼寿司(一个) [手持 热带鱼 右键, 消耗1个] [已实现]
- 手握热带鱼寿司(一个) -> 手握热带鱼寿司(两个) -> 手握热带鱼寿司(三个)
[手持 手握热带鱼寿司(一个) 右键, 逐级堆叠, 每级消耗1个] [已实现]
- 手握普通寿司 + 鱿鱼须 -> 手握鱿鱼寿司(一个) [手持 鱿鱼须 右键, 消耗1个] [已实现]
- 手握鱿鱼寿司(一个) -> 手握鱿鱼寿司(两个) -> 手握鱿鱼寿司(三个)
[手持 手握鱿鱼寿司(一个) 右键, 逐级堆叠, 每级消耗1个] [已实现]
六、寿司堆组
- 鳕鱼寿司(卷_4) -> 寿司堆(鳕鱼_两个) -> 寿司堆(鳕鱼_三个)
[手持 鳕鱼寿司(卷_4) 右键, 逐级堆叠, 每级消耗1个] [已实现]
- 鲑鱼寿司(成品卷) -> 寿司堆(鲑鱼_两个) -> 寿司堆(鲑鱼_三个)
[手持 鲑鱼寿司(成品卷) 右键, 逐级堆叠, 每级消耗1个] [已实现]
- 热带鱼寿司(卷_4) -> 寿司堆(热带鱼_两个) -> 寿司堆(热带鱼_三个)
[手持 热带鱼寿司(卷_4) 右键, 逐级堆叠, 每级消耗1个] [已实现]
- 递减: 寿司堆(X_三个) -> 寿司堆(X_两个) -> 卷寿司 [空手右键, 逐级取走]
机制: 每级取走一个并返还1个卷寿司; 鳕鱼/鲑鱼/热带鱼 同规则 [已实现]
七、盘装寿司组 (工作台合成)
- 盘子 + 手握热带鱼寿司(三个) + 热带鱼寿司(卷_4) -> 盘装寿司(手握热带鱼三份+热带鱼寿司) (plate_27) [已实现]
- 盘子 + 手握鳕鱼寿司(三个) + 鳕鱼寿司(卷_4) -> 盘装寿司(手握鳕鱼三份+鳕鱼寿司) (plate_28) [已实现]
- 盘子 + 手握鲑鱼寿司(三个) + 鲑鱼寿司(成品卷) -> 盘装寿司(手握鲑鱼三份+鲑鱼寿司) (plate_29) [已实现]
- 盘子 + 手握鱿鱼寿司(三个) + 热带鱼寿司(卷_4) -> 盘装寿司(手握鱿鱼三份+热带鱼寿司) (plate_42) [已实现]
(盘子 = 盘子方块 plate_0, 厨具分类可工作台合成)
【留后】吃(寿司块/手握 递减 空手右键吃)、饭团来源(汤锅熟米饭捏饭团, 属汤锅分类)
见 全部功能没做什么.txt 寿司节
+23
View File
@@ -175,3 +175,26 @@
- 未做原因: 后续实现(用户明确标注被告知先跳过), 当前果树仍为"树叶->果实"简单计时结果
(乡野自然转化关系.txt 一、果树·树叶)
########################################
【寿司】(xy_sushi)
########################################
(主要转换已实现于 xiangyemod/shousi, 见 全部功能做了什么.txt)
(对应 寿司转化关系.txt 二~八组; 方块中文名/英文id 见该 txt 文末【方块清单】)
一、吃 (寿司块/手握 递减食用)
- 鳕鱼寿司块(三个) -> 鳕鱼寿司块(两个) -> 鳕鱼寿司块(一个) ->空 [空手右键 吃] (txt 5)
- 鲑鱼寿司块(三个) -> 鲑鱼寿司块(两个) -> 鲑鱼寿司块(一个) ->空 [空手右键 吃] (txt 9)
- 热带鱼寿司块(三个) -> 热带鱼寿司块(两个) -> 热带鱼寿司块(一个) ->空 [空手右键 吃] (txt 13)
- 手握鳕鱼寿司(三个) -> 手握鳕鱼寿司(两个) -> 手握鳕鱼寿司(一个) ->空 [空手右键 吃] (txt 14)
- 手握鲑鱼寿司(三个) -> 手握鲑鱼寿司(两个) -> 手握鲑鱼寿司(一个) ->空 [空手右键 吃] (txt 15)
- 手握热带鱼寿司(三个) -> 手握热带鱼寿司(两个) -> 手握热带鱼寿司(一个) ->空 [空手右键 吃] (txt 16)
- 手握鱿鱼寿司(三个) -> 手握鱿鱼寿司(两个) -> 手握鱿鱼寿司(一个) ->空 [空手右键 吃] (txt 17)
- 未做原因: 均为"空手右键 吃"的食用递减, 食用部分由统一的"总食用功能"汇总实现,
本次不实现 (转化文档已用 todo 标注"吃的都 后续实现")
二、饭团来源 (汤锅熟米饭捏饭团)
- 熟米饭(汤锅煮好) 空手右键(不用碗) -> 饭团 (txt 23)
- 未做原因: 属汤锅分类, 汤锅代码尚未实现; 本次寿司功能只用饭团物品本身
(寿司的饭团暂靠创造模式/后续汤锅功能获取)
+112 -51
View File
@@ -1,86 +1,147 @@
========================================
【寿司】(xy_sushi) 转化关系
========================================
说明(基于行为包实际方块清单重写):
- 寿司方块: sushi_0(干海带/海苔)、sushi_1(干海带加米饭)
鳕鱼寿司(codsushi_1~6/codsushicubes_1/2)、鲑鱼寿司(salmonsushi_1~6/salmonsushicubes_1/2)、
热带鱼寿司(fishsushi_1~5/fishsushicubes_1/2/fishmonsushi_6)、
手握(nigirisushi 系列)、寿司堆(sushipile_0~5)、盘装(plate_27/28/29/42)
- 【米饭来源·逻辑严谨】寿司用"米饭"是熟米饭: 大米(brownrice, 食材) 经 汤锅 煮成生米锅,
计时煮熟, 木碗盛出为碗装米饭(bowlofrice), 才可用于做寿司。见 汤锅转化关系.txt 37~39
说明:
- 正文全部用中文方块名, 英文id见文末【方块清单】
- 【饭团来源·逻辑严谨】寿司用"饭团": 大米(brownrice) 经 汤锅 煮成生米锅,
计时煮熟为熟米饭, 空手右键(不用碗)捏成饭团, 才可用于做寿司。见 汤锅转化关系.txt 37~39
竹筒饭用生大米(见 面食.甜食 竹筒饭组), 二者不要混淆
- 制作规律: 海苔 -> 加米饭 -> 加鱼 -> 卷制 -> 切块 -> 堆叠/手握; 饭团由手握裹海苔而成
- 竹帘/菜刀: 卷制用 竹帘, 切块用 菜刀(cleaver, 厨具)
- 已归入禁用: 切寿司(cutsushi)
- 【饭团·新增】饭团(rice_balls) 由手握普通寿司裹海苔而成, 归 手握寿司组(sushi_05_nigiri)
- 制作规律: 海苔 -> 加饭团 -> 加鱼 -> 卷制; 卷制后: 切块(块组) 或 堆叠(堆组); 手握另起自 饭团 -> 手握普通寿司 -> 加鱼
- 卷制: 空手右键(每卷一级, 共四级); 切块: 手持 菜刀(cleaver, 厨具) 右键两次
- 已归入禁用: 切寿司(寿司_9)
========================================
一、寿司·基础组
========================================
1. sushi_0(干海带/海苔) -> sushi_1(干海带加米饭)
转换条件:[手持 米饭(汤锅盛出的碗装米饭 bowlofrice) 右键, 消耗1个]
机制: 海苔上铺米饭(米饭来源见 汤锅转化关系.txt)
1. 干海带 -> 干海带(加饭团) [手持 饭团 右键, 消耗4个]
机制: 海苔上铺饭团(饭团来源见 汤锅转化关系.txt)
========================================
二、鳕鱼寿司组
========================================
2. sushi_1 + 鳕鱼 -> codsushi_1(加鳕鱼) [手持 鳕鱼 右键, 消耗1个]
3. codsushi_1 -> codsushi_2 -> codsushi_3 -> codsushi_4 -> codsushi_5(卷制)
[手持 竹帘 右键, 逐级卷制]
4. codsushi_5 -> codsushi_6(切块/一个) -> codsushicubes_1(两个) -> codsushicubes_2(三个)
[手持 菜刀 右键切块, 再堆叠]
5. 递减: 三个 -> 两个 -> 块 [空手右键取走]
2. 干海带(加饭团) + 鳕鱼 -> 鳕鱼寿司(加鳕鱼) [手持 鳕鱼 右键, 消耗1个]
3. 鳕鱼寿司(加鳕鱼) -> 鳕鱼寿司(卷_1) -> 鳕鱼寿司(卷_2) -> 鳕鱼寿司(卷_3) -> 鳕鱼寿司(卷_4)
[空手右键, 逐级卷制]
机制: 右键, 每卷一级, 共四级
4. 鳕鱼寿司(卷_4) -> 鳕鱼寿司块(三个)
[手持 菜刀 右键, 逐级切块]
机制: 手持菜刀右键, 两次 获得 鳕鱼寿司块(三个)
5. 鳕鱼寿司块(三个) -> 鳕鱼寿司块(两个) -> 鳕鱼寿司块(一个) ->空
todo 空手右键 吃 (吃的都 后续实现)
========================================
三、鲑鱼寿司组
========================================
6. sushi_1 + 鲑鱼 -> salmonsushi_1(加鲑鱼) [手持 鲑鱼 右键]
7. salmonsushi_1 -> salmonsushi_2~5(卷制) [手持 竹帘 右键]
8. salmonsushi_5 -> salmonsushi_6(切块) -> salmonsushicubes_1(两个) -> salmonsushicubes_2(三个)
9. 递减: 空手右键取走
6. 干海带(加饭团) + 鲑鱼 -> 鲑鱼寿司(加鲑鱼) [手持 鲑鱼 右键]
7. 鲑鱼寿司(加鲑鱼) -> 鲑鱼寿司(卷_1) -> 鲑鱼寿司(卷_2) -> 鲑鱼寿司(卷_4) -> 鲑鱼寿司
[空手右键, 逐级卷制]
机制: 右键, 每卷一级, 共四级
(注: 鲑鱼卷的游戏内卷序命名不整齐, 无"卷_3"标注; 链顺序以此为准)
8. 鲑鱼寿司 -> 鲑鱼寿司块(三个)
[手持 菜刀 右键, 逐级切块]
机制: 手持菜刀右键, 两次 获得 鲑鱼寿司块(三个)
9. 鲑鱼寿司块(三个) -> 鲑鱼寿司块(两个) -> 鲑鱼寿司块(一个) ->空
todo 空手右键 吃 (吃的都 后续实现)
========================================
四、热带鱼寿司组
========================================
10. sushi_1 + 热带鱼 -> fishsushi_1(加热带鱼) [手持 热带鱼 右键]
11. fishsushi_1 -> fishsushi_2~5(卷制) [手持 竹帘 右键]
12. fishsushi_5 -> fishsushicubes_1(两个) -> fishsushicubes_2(三个)(含 fishmonsushi_6 切块态)
13. 递减: 空手右键取走
10. 干海带(加饭团) + 热带鱼 -> 热带鱼寿司(加热带鱼) [手持 热带鱼 右键]
11. 热带鱼寿司(加热带鱼) -> 热带鱼寿司(卷_1) -> 热带鱼寿司(卷_2) -> 热带鱼寿司(卷_3) -> 热带鱼寿司(卷_4)
[空手右键, 逐级卷制]
机制: 右键, 每卷一级, 共四级
12. 热带鱼寿司(卷_4) -> 热带鱼寿司块(三个)
[手持 菜刀 右键, 逐级切块]
机制: 手持菜刀右键, 两次 获得 热带鱼寿司块(三个)
13. 热带鱼寿司块(三个) -> 热带鱼寿司块(两个) -> 热带鱼寿司块(一个) ->空
todo 空手右键 吃 (吃的都 后续实现)
========================================
五、手握寿司组
========================================
(手握: sushi_1(加米饭) + 鱼 -> 手握一个 -> 两个 -> 三个;
饭团(rice_balls) 亦归本组)
14. sushi_1 + 鳕鱼 -> nigirisushicod_2(一个) -> nigirisushicod_3(两个)
(nigirisushifishcod 为鳕鱼手握)
15. sushi_1 + 鲑鱼 -> nigirisushisalnom_2(一个) -> nigirisushisalnom_3(两个)
(nigirisushifishsalmon_1 为鲑鱼手握)
16. sushi_1 + 热带鱼 -> nigirisushifish_1(一个) -> nigirisushifish_2(两个) -> nigirisushifish_3(三个)
17. sushi_1 + 鱿鱼 -> squid_sushi(一个) -> squidsushi_2(两个) -> squidsushi_3(三个)
18. sushi_1 -> nigirisushi(手握普通寿司) [直接成型, 【待确认】]
14. 手握普通寿司 + 鳕鱼 -> 手握鳕鱼寿司(一个)
[手持 鳕鱼 右键, 逐级堆叠]
手握鳕鱼寿司(一个) -> 手握鳕鱼寿司(两个) -> 手握鳕鱼寿司(三个)
[手持 手握鳕鱼寿司(一个) 右键, 逐级堆叠]
手握鳕鱼寿司(三个) -> 手握鳕鱼寿司(两个) -> 手握鳕鱼寿司(一个) ->空
todo 空手右键 吃 (吃的都 后续实现)
15. 手握普通寿司 + 鲑鱼 -> 手握鲑鱼寿司(一个)
[手持 鲑鱼 右键, 逐级堆叠]
手握鲑鱼寿司(一个) -> 手握鲑鱼寿司(两个) -> 手握鲑鱼寿司(三个)
[手持 手握鲑鱼寿司(一个) 右键, 逐级堆叠]
手握鲑鱼寿司(三个) -> 手握鲑鱼寿司(两个) -> 手握鲑鱼寿司(一个) ->空
todo 空手右键 吃 (吃的都 后续实现)
16. 手握普通寿司 + 热带鱼 -> 手握热带鱼寿司(一个)
[手持 热带鱼 右键, 逐级堆叠]
手握热带鱼寿司(一个) -> 手握热带鱼寿司(两个) -> 手握热带鱼寿司(三个)
[手持 手握热带鱼寿司(一个) 右键, 逐级堆叠]
手握热带鱼寿司(三个) -> 手握热带鱼寿司(两个) -> 手握热带鱼寿司(一个) ->空
todo 空手右键 吃 (吃的都 后续实现)
17. 手握普通寿司 + 鱿鱼 -> 手握鱿鱼寿司(一个)
[手持 鱿鱼 右键, 逐级堆叠]
手握鱿鱼寿司(一个) -> 手握鱿鱼寿司(两个) -> 手握鱿鱼寿司(三个)
[手持 手握鱿鱼寿司(一个) 右键, 逐级堆叠]
手握鱿鱼寿司(三个) -> 手握鱿鱼寿司(两个) -> 手握鱿鱼寿司(一个) ->空
todo 空手右键 吃 (吃的都 后续实现)
18. 饭团 -> 手握普通寿司
todo 饭团 右键 方块 放置 变成普通寿司
========================================
六、寿司堆组
========================================
(寿司块 -> 寿司堆(两个) -> (三个); 递减空手取走)
19. codsushicubes 系列 -> sushipile_0~5(寿司堆各态) [手持 寿司块 右键堆叠]
20. 递减: 三个 -> 两个 -> 块 [空手右键取走]
19. 鳕鱼寿司(卷_4)-> 寿司堆(鳕鱼_两个) -> 寿司堆(鳕鱼_三个)
[手持 鳕鱼寿司(卷_4) 右键, 逐级堆叠]
机制: 右键, 每堆一级, 共两级
20. 鲑鱼寿司(成品卷) -> 寿司堆(鲑鱼_两个) -> 寿司堆(鲑鱼_三个)
[手持 鲑鱼寿司(成品卷) 右键, 逐级堆叠]
机制: 右键, 每堆一级, 共两级
21. 热带鱼寿司(卷_4) -> 寿司堆(热带鱼_两个) -> 寿司堆(热带鱼_三个)
[手持 热带鱼寿司(卷_4) 右键, 逐级堆叠]
机制: 右键, 每堆一级, 共两级
22. 递减: 寿司堆(XX_三个) -> 寿司堆(XX_两个) -> 寿司(卷_4/成品卷)
[空手右键, 逐级取走]
机制: 空手右键, 每级取走一个, 共两级 (鳕鱼/鲑鱼/热带鱼 同规则)
========================================
七、盘装寿司组
========================================
- plate_27: 盘装寿司(手握热带鱼三份+热带鱼寿司)
- plate_28: 盘装寿司(手握鳕鱼三份+鳕鱼寿司)
- plate_29: 盘装寿司(手握鲑鱼三份+鲑鱼寿司)
- plate_42: 盘装寿司(手握鱿鱼三份+热带鱼寿司)
机制: 成品摆盘方块, 由对应手握/卷寿司组合摆放而成, 无独立转换
- 盘装寿司(手握热带鱼三份+热带鱼寿司)
- 盘装寿司(手握鳕鱼三份+鳕鱼寿司)
- 盘装寿司(手握鲑鱼三份+鲑鱼寿司)
- 盘装寿司(手握鱿鱼三份+热带鱼寿司)
机制: 成品摆盘方块 工作台合成 盘子 +手握 + 寿司卷(鳕鱼寿司(卷_4)/鲑鱼寿司(成品卷)/热带鱼寿司(卷_4))
========================================
八、饭团(新增)
八、饭团(来源)
========================================
物品: rice_balls(饭团)
21. 手握普通寿司(nigirisushi) + 海苔(sushi_0 干海带) -> rice_balls(饭团)
转换条件:[手持 海苔(干海带 sushi_0) 右键, 消耗1个]
机制: 米饭手握(手握普通寿司)裹上海苔, 捏成三角饭团, 掉落/获得饭团物品
(米饭来源见 汤锅转化关系.txt 米饭流程; 饭团归 手握寿司组 sushi_05_nigiri)
物品: 饭团
23. 汤锅(熟米饭) 形态 1/2/3 -> 饭团 [空手右键, 不用碗]
机制: 汤锅煮好的熟米饭, 不用碗盛出, 空手右键直接捏成饭团(饭团物品), 供寿司制作
(米饭流程见 汤锅转化关系.txt 37~39; 饭团归 手握寿司组)
========================================
【方块清单】(中文 -> 英文id, 供实现对照)
========================================
- 干海带: sushi_0
- 干海带(加饭团): sushi_1 (游戏内名"干海带(加米)")
- 鳕鱼寿司(加鳕鱼): codsushi_1; 卷_1: codsushi_2; 卷_2: codsushi_3; 卷_3: codsushi_4; 卷_4: codsushi_5
- 鳕鱼寿司块(一个): codsushicubes_1; (两个): codsushicubes_2; (三个): codsushi_6
- 鲑鱼寿司(加鲑鱼): salmonsushi_1; 卷_1: salmonsushi_2; 卷_2: salmonsushi_3; 卷_4: salmonsushi_4; 成品卷: salmonsushi_5
- 鲑鱼寿司块(一个): salmonsushicubes_1; (两个): salmonsushicubes_2; (三个): salmonsushi_6
- 热带鱼寿司(加热带鱼): fishsushi_1; 卷_1: fishsushi_2; 卷_2: fishsushi_3; 卷_3: fishsushi_4; 卷_4: fishsushi_5
- 热带鱼寿司块(一个): fishsushicubes_1; (两个): fishsushicubes_2; (三个): fishmonsushi_6
- 手握普通寿司: nigirisushi
- 手握鳕鱼寿司(一个): nigirisushifishcod; (两个): nigirisushicod_2; (三个): nigirisushicod_3
- 手握鲑鱼寿司(一个): nigirisushifishsalmon_1; (两个): nigirisushisalnom_2; (三个): nigirisushisalnom_3
- 手握热带鱼寿司(一个): nigirisushifish_1; (两个): nigirisushifish_2; (三个): nigirisushifish_3
- 手握鱿鱼寿司(一个): squid_sushi; (两个): squidsushi_2; (三个): squidsushi_3
- 寿司堆(热带鱼_两个): sushipile_0; (热带鱼_三个): sushipile_1; (鳕鱼_两个): sushipile_2;
(鳕鱼_三个): sushipile_3; (鲑鱼_两个): sushipile_4; (鲑鱼_三个): sushipile_5
- 盘装寿司(手握热带鱼三份+热带鱼寿司): plate_27; (手握鳕鱼三份+鳕鱼寿司): plate_28;
(手握鲑鱼三份+鲑鱼寿司): plate_29; (手握鱿鱼三份+热带鱼寿司): plate_42
- 饭团: rice_balls; 切寿司(禁用): cutsushi
+6 -4
View File
@@ -8,7 +8,7 @@
- 汤羹规律: XX(生_0) -> 四分熟_1 -> 八分熟_2 -> 熟_3, 计时约60秒一级
- 出锅: 手持 木碗(bowlasoup, 厨具) 右键, 消耗1个, 获得碗装成品(bowla*)
- 米饭流程: 大米(brownrice, 乡野食材) -> rawricepot(生米锅) -> ricepot_1~3(熟米饭)
-> 木碗盛出 bowlofrice(碗装米饭), 再用于 寿司(见 寿司转化关系.txt)/蛋炒饭(炒锅)
-> 空手右键 捏成饭团(rice_balls, 供寿司); 或 木碗盛出 bowlofrice(碗装米饭, 供蛋炒饭)
- 【鸡蛋·多用途联动】同一"鸡蛋"原料("鸡蛋堆 egg_pile"拆出或原版鸡蛋)贯穿三处:
-> 汤锅: 蛋花汤(eggsoup) / 煮鸡蛋(raweggsoup -> cookedeggsoup -> 水煮蛋)
-> 炒锅: 煎蛋(cookedegg, 炒锅转化关系.txt 第19条)
@@ -75,10 +75,12 @@
转换条件:[手持 大米(乡野食材, 生) 右键, 消耗1个]
38. rawricepot -> ricepot_1 -> ricepot_2 -> ricepot_3(熟米饭)
转换条件:[计时约60秒一级, 共三级变熟]
39. ricepot_3(熟米饭) + 木碗(bowlasoup) -> bowlofrice(碗装米饭)
39. ricepot_3(熟米饭) 空手右键 -> 饭团(rice_balls)
转换条件:[空手右键(不用碗)]
机制: 熟米饭直接捏成饭团, 供 寿司 干海带+饭团(寿司转化关系.txt)
39a. ricepot_3(熟米饭) + 木碗(bowlasoup) -> bowlofrice(碗装米饭)
转换条件:[手持 木碗 右键, 消耗1个木碗]
(碗装米饭 bowlofrice/bowlofrice_2/bowlofrice_3 用于:
寿司 干海带+米饭(寿司转化关系.txt) / 炒锅 蛋炒饭(炒锅转化关系.txt))
机制: 熟米饭木碗盛出为碗装米饭, 供 炒锅 蛋炒饭(炒锅转化关系.txt)
========================================
五、煮鸡蛋组(新增独立分组 itemGroup.name.tangguo_boiledeggs)
+2 -1
View File
@@ -8,7 +8,8 @@
加工中擀面杖会被消耗, 干完最后一步掉落返还(见 厨具转化关系.txt 七)
- 【蛋液半成品】plate_34: 由 搅拌器(厨具) 鸡蛋牛奶流程 用盘子取出(见 厨具转化关系.txt 三)
(鸡蛋同源: 另用于 汤锅 煮鸡蛋/蛋花汤、炒锅 煎蛋, 见 汤锅/炒锅转化关系.txt)
- 【米饭/大米区分】: 竹筒饭/生米锅用 生大米(brownrice); 蛋炒饭/寿司用 熟米饭(汤锅盛出)
- 【米饭/大米区分】: 竹筒饭/生米锅用 生大米(brownrice); 蛋炒饭用 碗装米饭(汤锅木碗盛出);
寿司用 饭团(汤锅熟米饭空手右键捏成, 见 汤锅转化关系.txt 39/39a)
- 【面团用途】: 面团(rawdough/dought 系列) 供 丸子机(厨具)/炒锅煎饼(炒锅) 使用
- 【生面】noodles: 供 汤锅生面汤/炒锅意面(见 汤锅/炒锅转化关系.txt)
- 发酵/醒面/烘焙/蒸制 多为计时转换, 约60秒一级