乡野食材 功能实现 1

This commit is contained in:
wenhe committed 2026-09-08 15:43:09 +08:00
1 parent b947847def
commit 098290c6b6
21 files changed
+697 -1583

No files matched your search

@@ -16,6 +16,7 @@ from xiangyemod.chuju.service.ChujuService import ChujuService
from xiangyemod.chuju.service.ChujuTimerService import ChujuTimerService from xiangyemod.chuju.service.ChujuTimerService import ChujuTimerService
from xiangyemod.ziran.service.NaturalService import NaturalService from xiangyemod.ziran.service.NaturalService import NaturalService
from xiangyemod.ziran.service.NaturalTimerService import NaturalTimerService from xiangyemod.ziran.service.NaturalTimerService import NaturalTimerService
from xiangyemod.shicai.service.ShicaiService import ShicaiService
if not serverApi.IsInServer(): if not serverApi.IsInServer():
pass pass
@@ -0,0 +1,101 @@
# -*- coding: utf-8 -*-
"""
================================================================================
乡野食材(xy_ingredients)·切配与裹粉 规则数据
================================================================================
统一管理"食材切配"(菜刀切分 / 蒜末) 与 "裹粉半成品" 的规则常量。
只被 ShicaiService 读取,FeatureDispatcher 通过方块名 O(1) 路由到服务。
【一、菜刀切分】(CHOP_CHAINS)
手持 菜刀(rtdd:cleaver) 右键"摆放地上"的切配方块, 逐级切分;
切到最后一级再切 -> 掉落对应"碎"(数量见 drop) 并把方块变空气。
【二、蒜末】(GARLIC)
手持 菜刀 右键 大蒜(rtdd:cutgarlic) 三次 -> 掉落 16 个蒜末并消失。
【三、裹粉】(COATING_RULES)
手持生食材右键 面粉块(rtdd:farineblock_3) -> 消耗若干生食材 + 面粉块(变空气),
掉落对应的裹粉半成品物品(供油锅炸物)。
================================================================================
"""
# 菜刀
CLEAVER_ITEM = "rtdd:cleaver"
# 切分链: blocks 为逐级方块序列, 切到最后一级继续切 -> 掉 drop 并变空气
CHOP_CHAINS = [
{
"blocks": [
"rtdd:cutcarrot_0", "rtdd:cutcarrot_1", "rtdd:cutcarrot_2",
"rtdd:cutcarrot_3", "rtdd:cutcarrot_4",
],
"drop": {"name": "rtdd:crushed_carrots", "count": 3},
"tip": "§a切出了胡萝卜碎",
},
{
"blocks": [
"rtdd:cutpotato_0", "rtdd:cutpotato_1", "rtdd:cutpotato_2",
"rtdd:cutpotato_3", "rtdd:cutpotato_4",
],
"drop": {"name": "rtdd:potato_wedges", "count": 3},
"tip": "§a切出了土豆块",
},
{
"blocks": [
"rtdd:cutvegetable_0", "rtdd:cutvegetable_1",
"rtdd:cutvegetable_2", "rtdd:cutvegetable_3",
],
"drop": {"name": "rtdd:vegetable", "count": 3},
"tip": "§a切出了青菜碎",
},
{
"blocks": [
"rtdd:cutscallions_1", "rtdd:cutscallions_2",
"rtdd:cutscallions_3", "rtdd:cutscallions_4",
],
"drop": {"name": "rtdd:crushed_scallions", "count": 3},
"tip": "§a切出了葱花碎",
},
]
# ---- 蒜末: 大蒜 + 菜刀右键 GARLIC_CHOP_COUNT 次 -> 掉落 GARLIC_DROP ----
GARLIC_BLOCK = "rtdd:cutgarlic"
GARLIC_CHOP_COUNT = 3
GARLIC_DROP = {"name": "rtdd:crushedgarlic", "count": 16}
# ---- 裹粉: 面粉块 + 生食材 -> 掉落裹粉半成品 ----
FLOUR_BLOCK = "rtdd:farineblock_3"
COATING_RULES = [
{"item": "rtdd:sashimi", "count": 6,
"drop": {"name": "rtdd:oilfish_0", "count": 1}},
{"item": "rtdd:lobster", "count": 2,
"drop": {"name": "rtdd:oiltempura", "count": 1}},
{"item": "minecraft:porkchop", "count": 1,
"drop": {"name": "rtdd:oilpork", "count": 1}},
{"item": "minecraft:chicken", "count": 1,
"drop": {"name": "rtdd:oil_chickennuggets", "count": 6}},
{"item": "minecraft:potato", "count": 1,
"drop": {"name": "rtdd:oilfrenchfries", "count": 10}},
]
# ---- 左键破坏掉落: 摆在地上的切配方块 -> 原版食材(相对"切配态"的原版不切物品) ----
DESTROY_DROP = {
"rtdd:cutcarrot_0": "minecraft:carrot",
"rtdd:cutcarrot_1": "minecraft:carrot",
"rtdd:cutcarrot_2": "minecraft:carrot",
"rtdd:cutcarrot_3": "minecraft:carrot",
"rtdd:cutcarrot_4": "minecraft:carrot",
"rtdd:cutpotato_0": "minecraft:potato",
"rtdd:cutpotato_1": "minecraft:potato",
"rtdd:cutpotato_2": "minecraft:potato",
"rtdd:cutpotato_3": "minecraft:potato",
"rtdd:cutpotato_4": "minecraft:potato",
"rtdd:cutvegetable_0": "rtdd:qingcai",
"rtdd:cutvegetable_1": "rtdd:qingcai",
"rtdd:cutvegetable_2": "rtdd:qingcai",
"rtdd:cutvegetable_3": "rtdd:qingcai",
"rtdd:cutscallions_1": "rtdd:scallions",
"rtdd:cutscallions_2": "rtdd:scallions",
"rtdd:cutscallions_3": "rtdd:scallions",
"rtdd:cutscallions_4": "rtdd:scallions",
}
@@ -0,0 +1 @@
# -*- coding: utf-8 -*-
@@ -0,0 +1,292 @@
# -*- coding: utf-8 -*-
"""
================================================================================
乡野食材·切配与裹粉 右键转换引擎(服务端)
================================================================================
处理"乡野食材"(xy_ingredients) 分类下的右键转换:
菜刀切分配(胡萝卜/土豆/青菜/葱花 逐级切 + 切碎掉落)、
蒜末(大蒜+菜刀右键三次)、裹粉半成品(生食材+面粉块)。
【事件监听在哪?】
本类【不】监听任何事件!
所有事件由 FeatureDispatcher 统一监听,按 blockOwner 路由到本类 handleBlockUse。
【本类怎么做】
handleBlockUse ← 入口:分发器转发右键方块事件
├─ _handleChop ← 菜刀切分(切配方块逐级推进 / 最后一刀掉碎)
├─ _handleGarlic ← 蒜末(菜刀右键大蒜计数)
└─ _handleCoating ← 裹粉(生食材右键面粉块)
(通用工具) getCarriedItem / consumeItem / dropItems / replaceBlock /
clearBlock / 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 ..ShicaiData import (
CLEAVER_ITEM, CHOP_CHAINS, GARLIC_BLOCK, GARLIC_CHOP_COUNT,
GARLIC_DROP, FLOUR_BLOCK, COATING_RULES, DESTROY_DROP,
)
# ---- 统一分发器 ----
from ...service.FeatureDispatcher import FeatureDispatcher
class ShicaiService(BlueFoxServerSystem):
"""
乡野食材·切配与裹粉 右键转换引擎
"""
def __init__(self, namespace, systemName):
super(ShicaiService, self).__init__(namespace, systemName)
print "===== ShicaiService init ====="
# ---- 切分链映射: 方块名 -> (链, 索引) O(1) ----
self.chopMap = {}
self.featureBlocks = set()
for chain in CHOP_CHAINS:
for i, b in enumerate(chain["blocks"]):
self.chopMap[b] = (chain, i)
self.featureBlocks.add(b)
# ---- 蒜末方块 + 面粉块 ----
self.featureBlocks.add(GARLIC_BLOCK)
self.featureBlocks.add(FLOUR_BLOCK)
# ---- 裹粉规则映射: 手持物品名 -> 规则 ----
self.coatingMap = {}
for r in COATING_RULES:
self.coatingMap[r["item"]] = r
# ---- 蒜末切菜计数 {(dim,x,y,z): n} ----
self.garlicChop = {}
# ---- 右键冷却表 ----
self.cooldown = {}
# ---- 注册到统一分发器 ----
FeatureDispatcher.register(self)
# ============================================================================
# 一、给 FeatureDispatcher 的接口
# ============================================================================
def getFeatureBlocks(self):
"""返回本功能管辖的所有右键方块名集合"""
return self.featureBlocks
def getItemUseOnRules(self):
"""手持物品右键方块表面不需要单独路由, 返回空"""
return {}
def handleDestroy(self, args):
"""由 FeatureDispatcher 转发的"玩家左键破坏方块"入口。
摆在地上的切配方块(切胡萝卜/切土豆/切青菜/葱花) 被左键打碎 ->
掉落对应的原版食材(胡萝卜/土豆/青菜/葱), 并清空方块。
返回 True=处理了; False=不属本功能管。"""
blockName = args.get("fullName") or args.get("blockName")
itemName = DESTROY_DROP.get(blockName)
if not itemName:
return False
playerId = args.get("playerId")
x, y, z = args.get("x"), args.get("y"), args.get("z")
dim = comp.CreateDimension(playerId).GetEntityDimensionId()
# 取消默认破坏+默认掉落(不让切配方块本身掉出来)
args['cancel'] = True
args['spawnResources'] = False
# 清空方块为空气(aux 强制 0, 保证定向变体正常清除)
try:
comp.CreateBlockInfo(LevelId).SetBlockNew(
(x, y, z), blockDict={"name": "minecraft:air", "aux": 0},
oldBlockHandling=0, dimensionId=dim)
except Exception:
pass
# 掉落原版食材
try:
self.CreateEngineItemEntity(
{"itemName": itemName, "count": 1, "auxValue": 0},
dim, (x, y + 0.5, z))
except Exception:
pass
return 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.chopMap:
return self._handleChop(blockName, playerId, pos, dim, itemDict, itemName, key)
# ---- 蒜末 ----
if blockName == GARLIC_BLOCK:
return self._handleGarlic(playerId, pos, dim, itemDict, itemName, key)
# ---- 裹粉 ----
if blockName == FLOUR_BLOCK:
return self._handleCoating(playerId, pos, dim, itemDict, itemName, key)
return False
# ============================================================================
# 二、菜刀切分配
# ============================================================================
def _handleChop(self, blockName, playerId, pos, dim, itemDict, itemName, key):
if itemName != CLEAVER_ITEM:
return False
chain, idx = self.chopMap[blockName]
blocks = chain["blocks"]
if not self.checkCooldown(key, 0.3):
return True
if idx < len(blocks) - 1:
# 逐级推进到下一刀
self.replaceBlock(pos, dim, blocks[idx + 1], playerId)
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a继续切配…")
else:
# 最后一级再切 -> 掉碎 + 变空气
self.clearBlock(pos, dim)
self.dropItems(dim, pos, [chain["drop"]])
comp.CreateMsg(playerId).NotifyOneMessage(
playerId, chain.get("tip", "§a切好了"))
return True
# ============================================================================
# 三、蒜末(大蒜 + 菜刀右键三次 -> 掉 16 蒜末)
# ============================================================================
def _handleGarlic(self, playerId, pos, dim, itemDict, itemName, key):
if itemName != CLEAVER_ITEM:
return False
if not self.checkCooldown(key, 0.3):
return True
gkey = (dim, pos[0], pos[1], pos[2])
n = self.garlicChop.get(gkey, 0) + 1
if n >= GARLIC_CHOP_COUNT:
self.clearBlock(pos, dim)
self.dropItems(dim, pos, [GARLIC_DROP])
self.garlicChop.pop(gkey, None)
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a切好了蒜末")
else:
self.garlicChop[gkey] = n
comp.CreateMsg(playerId).NotifyOneMessage(
playerId, "§a切大蒜中…(%d/%d)" % (n, GARLIC_CHOP_COUNT))
return True
# ============================================================================
# 四、裹粉(生食材右键面粉块 -> 掉裹粉物品)
# ============================================================================
def _handleCoating(self, playerId, pos, dim, itemDict, itemName, key):
rule = self.coatingMap.get(itemName)
if not rule:
return False
need = rule.get("count", 1)
if itemDict is not None and (itemDict.get("count") or 0) < need:
comp.CreateMsg(playerId).NotifyOneMessage(
playerId, "§c数量不足,需要 %d 个" % need)
return True
if not self.checkCooldown(key, 0.5):
return True
self.consumeItem(playerId, itemDict, need)
self.clearBlock(pos, dim)
self.dropItems(dim, pos, [rule["drop"]])
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a裹粉完成")
return True
# ============================================================================
# 五、工具方法:获取玩家主手物品
# ============================================================================
def getCarriedItem(self, playerId):
itemComp = comp.CreateItem(playerId)
return itemComp.GetPlayerItem(
serverApi.GetMinecraftEnum().ItemPosType.CARRIED, 0, True)
# ============================================================================
# 六、工具方法:消耗物品
# ============================================================================
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", {})})
# ============================================================================
# 七、工具方法:替换方块 / 清空方块
# ============================================================================
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 clearBlock(self, pos, dim):
"""把方块清空为空气(切完拿碎/裹粉耗掉面粉块)"""
comp.CreateBlockInfo(LevelId).SetBlockNew(
pos, blockDict={"name": "minecraft:air", "aux": 0},
oldBlockHandling=0, dimensionId=dim)
# ============================================================================
# 八、工具方法:以掉落物形式生成物品
# ============================================================================
def dropItems(self, dim, pos, dropList):
for d in dropList:
itemDict = {
"itemName": d["name"],
"count": d.get("count", 1),
"auxValue": d.get("aux", 0),
}
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
# ============================================================================
# 九、工具方法:冷却检查
# ============================================================================
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 -*-
@@ -53,6 +53,31 @@ ITEM_USE_ON_RULES = [
"consume": 1, "consume": 1,
"tip": "§a已放置死鳕鱼", "tip": "§a已放置死鳕鱼",
}, },
# ---- 蔬菜·切配: 原版食材右键放置 -> 摆放地上的切配方块 ----
{
"item": "minecraft:carrot", # 原版胡萝卜
"target": "rtdd:cutcarrot_0", # 切胡萝卜(摆放地上)
"consume": 1,
"tip": "§a已放置胡萝卜,可手持菜刀切配",
},
{
"item": "minecraft:potato", # 原版土豆
"target": "rtdd:cutpotato_0", # 切土豆(摆放地上)
"consume": 1,
"tip": "§a已放置土豆,可手持菜刀切配",
},
{
"item": "rtdd:qingcai", # 青菜(整颗)
"target": "rtdd:cutvegetable_0", # 切青菜(摆放地上)
"consume": 1,
"tip": "§a已放置青菜,可手持菜刀切配",
},
{
"item": "rtdd:scallions", # 葱
"target": "rtdd:cutscallions_1", # 葱花_1
"consume": 1,
"tip": "§a已放置葱,可手持菜刀切分",
},
] ]
# ---- 二、盘子转换: 手持原版食物右键 空盘子(plate_0), 盘子变为对应成品盘 ---- # ---- 二、盘子转换: 手持原版食物右键 空盘子(plate_0), 盘子变为对应成品盘 ----
@@ -1,55 +0,0 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "rtdd:plantvegetables",
"register_to_creative_menu": true,
"category": "xy_ingredients"
},
"components": {
"netease:aabb": {
"collision": {
"min": [
0,
0,
0.1
],
"max": [
1,
0.15,
0.75
]
},
"clip": {
"min": [
0,
0,
0.1
],
"max": [
1,
0.15,
0.75
]
}
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:render_layer": {
"value": "alpha"
},
"netease:solid": {
"value": false
},
"netease:face_directional": {
"type": "direction"
},
"netease:block_entity": {
"client_tick": false,
"movable": false,
"tick": false
}
}
}
}
@@ -23,7 +23,7 @@
"rtdd:cutscallions_3", "rtdd:cutscallions_3",
"rtdd:cutscallions_4", "rtdd:cutscallions_4",
"rtdd:scallions", "rtdd:scallions",
"rtdd:plantvegetables", "rtdd:qingcai",
"rtdd:vegetable", "rtdd:vegetable",
"rtdd:crushed_carrots", "rtdd:crushed_carrots",
"rtdd:crushed_scallions", "rtdd:crushed_scallions",
@@ -0,0 +1,12 @@
{
"format_version": "1.10",
"minecraft:item": {
"components": {
"minecraft:max_stack_size": 64
},
"description": {
"category": "xy_ingredients",
"identifier": "rtdd:qingcai"
}
}
}
@@ -0,0 +1,31 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"P": {
"item": "rtdd:pepper",
"data": 0
},
"R": {
"item": "rtdd:b_34",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_chiliskewer"
},
"pattern": [
"PPP",
"PRP",
"PRP"
],
"result": {
"data": 0,
"item": "rtdd:chiliskewer",
"count": 1
},
"tags": [
"crafting_table"
]
}
}
@@ -0,0 +1,31 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"G": {
"item": "rtdd:cutgarlic",
"data": 0
},
"R": {
"item": "rtdd:b_34",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_garlicskewers"
},
"pattern": [
"GGG",
"GRG",
"GRG"
],
"result": {
"data": 0,
"item": "rtdd:garlicskewers",
"count": 1
},
"tags": [
"crafting_table"
]
}
}
@@ -0,0 +1,59 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"0": {
"item": "rtdd:orange",
"data": 0
},
"1": {
"item": "rtdd:orange",
"data": 0
},
"2": {
"item": "rtdd:orange",
"data": 0
},
"3": {
"item": "rtdd:orange",
"data": 0
},
"4": {
"item": "rtdd:orange",
"data": 0
},
"5": {
"item": "rtdd:orange",
"data": 0
},
"6": {
"item": "rtdd:orange",
"data": 0
},
"7": {
"item": "rtdd:orange",
"data": 0
},
"8": {
"item": "rtdd:orange",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_orangepile_0"
},
"pattern": [
"012",
"345",
"678"
],
"result": {
"data": 0,
"item": "rtdd:orangepile_0",
"count": 1
},
"tags": [
"crafting_table"
]
}
}
@@ -0,0 +1,59 @@
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"key": {
"0": {
"item": "rtdd:peach",
"data": 0
},
"1": {
"item": "rtdd:peach",
"data": 0
},
"2": {
"item": "rtdd:peach",
"data": 0
},
"3": {
"item": "rtdd:peach",
"data": 0
},
"4": {
"item": "rtdd:peach",
"data": 0
},
"5": {
"item": "rtdd:peach",
"data": 0
},
"6": {
"item": "rtdd:peach",
"data": 0
},
"7": {
"item": "rtdd:peach",
"data": 0
},
"8": {
"item": "rtdd:peach",
"data": 0
}
},
"description": {
"identifier": "rtdd:xy_peachpile_0"
},
"pattern": [
"012",
"345",
"678"
],
"result": {
"data": 0,
"item": "rtdd:peachpile_0",
"count": 1
},
"tags": [
"crafting_table"
]
}
}
-5
View File
@@ -2149,11 +2149,6 @@
"sound": "wood", "sound": "wood",
"textures": "rtdd_blocks_vegetables" "textures": "rtdd_blocks_vegetables"
}, },
"rtdd:plantvegetables": {
"netease_model": "rtdd:plantvegetables",
"sound": "grass",
"textures": "rtdd_blocks_vegetables"
},
"rtdd:cutvegetable_1": { "rtdd:cutvegetable_1": {
"netease_model": "rtdd:cutvegetable_1", "netease_model": "rtdd:cutvegetable_1",
"sound": "wood", "sound": "wood",
File diff suppressed because it is too large. Load diff
+2 -5
View File
@@ -161,8 +161,6 @@ tile.rtdd:beefkebabs_3.name=牛肉串(熟)
tile.rtdd:cookingmeat_1.name=炒锅_45(炒碎肉_熟) tile.rtdd:cookingmeat_1.name=炒锅_45(炒碎肉_熟)
tile.rtdd:cookingcookedporkloin.name=炒锅_30(小炒五花肉_生) tile.rtdd:cookingcookedporkloin.name=炒锅_30(小炒五花肉_生)
tile.rtdd:crushed_copper_ore_1.name=铜矿(碎铜矿_1)_禁用 tile.rtdd:crushed_copper_ore_1.name=铜矿(碎铜矿_1)_禁用
tile.rtdd:plantvegetables_1.name=青菜_6(青菜_1)
tile.rtdd:plantvegetables_3.name=青菜_7(青菜_3)
tile.rtdd:carrotcodsoup.name=汤锅_13(胡萝卜鳕鱼汤_生) tile.rtdd:carrotcodsoup.name=汤锅_13(胡萝卜鳕鱼汤_生)
tile.rtdd:dumplingssoup.name=饺子_碗装 tile.rtdd:dumplingssoup.name=饺子_碗装
tile.rtdd:plate_17.name=生鱼片 tile.rtdd:plate_17.name=生鱼片
@@ -249,7 +247,6 @@ tile.rtdd:b_108.name=古式唱片机(无碟)
tile.rtdd:balance.name=天平 tile.rtdd:balance.name=天平
tile.rtdd:b_109.name=古式唱片机(有碟) tile.rtdd:b_109.name=古式唱片机(有碟)
tile.rtdd:plate_53.name=胡萝卜炒猪肉 tile.rtdd:plate_53.name=胡萝卜炒猪肉
tile.rtdd:plantvegetables.name=青菜_5(青菜)
tile.rtdd:plate_54.name=香菇滑鸡 tile.rtdd:plate_54.name=香菇滑鸡
tile.rtdd:plate_51.name=炸饺子 tile.rtdd:plate_51.name=炸饺子
tile.rtdd:plate_52.name=土豆炒猪肉 tile.rtdd:plate_52.name=土豆炒猪肉
@@ -846,7 +843,6 @@ tile.rtdd:cutvegetable_1.name=切青菜(切一刀)
tile.rtdd:b_269.name=橘木 tile.rtdd:b_269.name=橘木
tile.rtdd:bowlavegetablebeefsoup.name=清汤羊肉 tile.rtdd:bowlavegetablebeefsoup.name=清汤羊肉
tile.rtdd:cutvegetable_0.name=切青菜(摆放地上) tile.rtdd:cutvegetable_0.name=切青菜(摆放地上)
tile.rtdd:plantvegetables.name=青菜
tile.rtdd:garlicskewers.name=大蒜串 tile.rtdd:garlicskewers.name=大蒜串
tile.rtdd:cookingcookedporkribs.name=炒锅_32(胡萝卜炒猪排骨_生) tile.rtdd:cookingcookedporkribs.name=炒锅_32(胡萝卜炒猪排骨_生)
tile.rtdd:fish_2.name=挂肉钩_6(鱼_2(禁用)) tile.rtdd:fish_2.name=挂肉钩_6(鱼_2(禁用))
@@ -1243,6 +1239,7 @@ item.rtdd:crushed_scallions.name=葱花碎
item.rtdd:potato_wedges.name=土豆块 item.rtdd:potato_wedges.name=土豆块
item.rtdd:cream_0.name=奶油 item.rtdd:cream_0.name=奶油
item.rtdd:rice_seeds.name=稻谷 item.rtdd:rice_seeds.name=稻谷
item.rtdd:vegetable.name=青菜 item.rtdd:vegetable.name=青菜碎
item.rtdd:qingcai.name=青菜
item.rtdd:rice_balls.name=饭团 item.rtdd:rice_balls.name=饭团
item.rtdd:boiled_egg.name=水煮蛋 item.rtdd:boiled_egg.name=水煮蛋
@@ -129,6 +129,9 @@
}, },
"vegetable": { "vegetable": {
"textures": "textures/items/vegetable" "textures": "textures/items/vegetable"
},
"qingcai": {
"textures": "textures/items/meiqiedeqingcai"
} }
} }
} }
Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

+31 -33
View File
@@ -17,37 +17,40 @@
【原版放置】手持原版食材右键地面/方块表面, 消耗1个, 生成"摆放地上"形态: 【原版放置】手持原版食材右键地面/方块表面, 消耗1个, 生成"摆放地上"形态:
- 原版胡萝卜(minecraft:carrot) 右键放置 -> 切胡萝卜(摆放地上 cutcarrot_0) - 原版胡萝卜(minecraft:carrot) 右键放置 -> 切胡萝卜(摆放地上 cutcarrot_0)
- 原版土豆(minecraft:potato) 右键放置 -> 切土豆(摆放地上 cutpotato_0) - 原版土豆(minecraft:potato) 右键放置 -> 切土豆(摆放地上 cutpotato_0)
- 原版青菜(rtdd:vegetable, 青菜) 右键放置 -> 切青菜(摆放地上 cutvegetable_0) - 原版青菜(rtdd:qingcai, 青菜) 右键放置 -> 切青菜(摆放地上 cutvegetable_0)
- 原版葱(rtdd:scallions, 葱) 右键放置 -> 葱花_1(cutscallions_1)
- 摆在地上的切配方块(切胡萝卜/切土豆/切青菜/葱花) 左键打碎 -> 掉落 原版食材(胡萝卜/土豆/青菜/葱)
1. 切胡萝卜(摆放地上) -> 切胡萝卜(切一块) -> 切胡萝卜(切两块) -> 切胡萝卜(切三块) -> 切胡萝卜(切四块) 1. 切胡萝卜(摆放地上) -> 切胡萝卜(切一块) -> 切胡萝卜(切两块) -> 切胡萝卜(切三块) -> 切胡萝卜(切四块)
转换条件:[手持 菜刀 右键 依次切割] 转换条件:[手持 菜刀 右键 依次切割]
机制: 手持菜刀右键,每刀切一级,共四刀 机制: 手持菜刀右键,每刀切一级,共四刀
1a. 切胡萝卜(切四块) -> 胡萝卜碎(crushed_carrots) 1a. 切胡萝卜(切四块) -> 胡萝卜碎(crushed_carrots)
转换条件:[右键 进行转换(进一步切碎)] 转换条件:[手持 菜刀 右键 进行转换(进一步切碎)]
机制: 切到四块后继续切, 变为 胡萝卜碎(切配半成品)【待确认: 具体切法】 机制: 切到四块后继续切, 掉落 3个 胡萝卜碎
2. 切土豆(摆放地上) -> 切土豆(去皮) -> 切土豆(切一块) -> 切土豆(切两块) -> 切土豆(切三块) 2. 切土豆(摆放地上) -> 切土豆(去皮) -> 切土豆(切一块) -> 切土豆(切两块) -> 切土豆(切三块)
转换条件:[手持 菜刀 右键 依次切割] 转换条件:[手持 菜刀 右键 依次切割]
机制: 手持菜刀右键,先去皮再逐级切,共四刀 机制: 手持菜刀右键,先去皮再逐级切,共四刀
2a. 切土豆(切三块) -> 土豆块(potato_wedges) 2a. 切土豆(切三块) -> 土豆块(potato_wedges)
转换条件:[右键 进行转换(切块)] 转换条件:[手持 菜刀右键 进行转换(切块)]
机制: 切到三块后继续切, 变为 土豆块(切配半成品, 供油锅炸薯条)【待确认: 具体切法】 机制: 切到三块后继续切, 掉落 3个 土豆块(切配半成品, 供油锅炸薯条)
3. 切青菜(摆放地上) -> 切青菜(切一刀) -> 切青菜(切两刀) -> 切青菜(切三刀) 3. 切青菜(摆放地上) -> 切青菜(切一刀) -> 切青菜(切两刀) -> 切青菜(切三刀)
转换条件:[手持 菜刀 右键 依次切割] 转换条件:[手持 菜刀 右键 依次切割]
机制: 手持菜刀右键,每刀切一级,共三刀 机制: 手持菜刀右键,每刀切一级,共三刀
3a. 切青菜(切三刀) -> 青菜碎(rtdd:vegetable)
转换条件:[手持 菜刀 右键 进行转换(进一步切碎)]
机制: 切到三刀后继续切, 掉落 3个 青菜碎(切配半成品)
4. 葱花_1 -> 葱花_2 -> 葱花_3 -> 葱花_4 4. 葱花_1 -> 葱花_2 -> 葱花_3 -> 葱花_4
转换条件:[手持 菜刀 右键 依次切分葱] 转换条件:[手持 菜刀 右键 依次切分葱]
机制: 手持菜刀右键切葱,逐级切分 机制: 手持菜刀右键切葱,逐级切分
4a. 葱花_4 -> 葱花碎(crushed_scallions) 4a. 葱花_4 -> 葱花碎(crushed_scallions)
转换条件:[右键 进行转换(进一步切碎)] 转换条件:[手持 菜刀 右键 进行转换(进一步切碎)]
机制: 切到葱花_4后继续切, 变为 葱花碎(切配半成品)【待确认: 具体切法】 机制: 切到葱花_4后继续切, 掉落 3个 葱花碎(切配半成品)
5. 葱(scallions) 5. 葱(scallions)
转换条件:[静态食材,无独立转换](本次由Java版迁入,用于炒锅加葱/葱花锅底) 转换条件:[静态食材,无独立转换](本次由Java版迁入,用于炒锅加葱/葱花锅底)
放置: 手持葱右键 -> 葱花_1(cutscallions_1)
5a. 青菜(原版, plantvegetables/vegetable) 5a. 青菜(qingcai)
转换条件:[静态食材,无独立转换] 转换条件:[静态食材,无独立转换]
机制: 原版不切状态, 手持右键放置后成为切青菜(摆放地上), 再菜刀切分 [已从Java版迁入] 机制: 原版不切状态, 手持右键放置后成为切青菜(摆放地上), 再菜刀切分 [已从Java版迁入]
@@ -75,11 +78,9 @@
======================================== ========================================
四、食材堆(各类堆叠食材集中分组) 四、食材堆(各类堆叠食材集中分组)
======================================== ========================================
10. 土豆堆 / 胡萝卜堆(b_40) / 桃子堆 / 橙子堆 / 苹果堆 / 鸡蛋堆 / 鲑鱼堆 / 鳕鱼堆 / 面包堆 10. 土豆堆 / 胡萝卜堆/ 桃子堆 / 橙子堆 / 苹果堆 / 鸡蛋堆 / 鲑鱼堆 / 鳕鱼堆 / 面包堆
转换条件:[静态堆叠食材,无独立转换] 转换条件:[静态堆叠食材,无独立转换]
说明: 各类"XX堆"集中到本组"食材堆"(含原鱼·海鲜的鲑鱼堆/鳕鱼堆、原谷物·米面的面包堆) 配方(工作台): 九个对应食材 合成 堆; 堆 放工作台 分解成 九个对应食材
- 鸡蛋堆(egg_pile)仍属食材堆, 供鸡窝/蛋液/汤锅煮鸡蛋(raweggsoup)/蛋花汤(eggsoup)/炒锅煎蛋(cookedegg)等使用
======================================== ========================================
五、蔬果·水果(单个水果, 供榨汁/冰棍/炒冰) 五、蔬果·水果(单个水果, 供榨汁/冰棍/炒冰)
======================================== ========================================
@@ -93,9 +94,6 @@
转换条件:[静态食材,无独立转换](本次由Java版迁入,用于生米锅/米饭/竹筒饭/蛋炒饭; 转换条件:[静态食材,无独立转换](本次由Java版迁入,用于生米锅/米饭/竹筒饭/蛋炒饭;
米饭需先经 汤锅 煮熟盛出, 再做寿司(含饭团 rice_balls)/蛋炒饭等) 米饭需先经 汤锅 煮熟盛出, 再做寿司(含饭团 rice_balls)/蛋炒饭等)
13. 生面(noodles)
转换条件:[静态食材,无独立转换](本次由Java版迁入,归本组,用作汤锅生面汤/炒锅意面的面条食材)
======================================== ========================================
七、调味·佐料 七、调味·佐料
======================================== ========================================
@@ -103,10 +101,10 @@
转换条件:[静态切配食材,无独立转换] 转换条件:[静态切配食材,无独立转换]
16. 蒜末(crushedgarlic) 16. 蒜末(crushedgarlic)
转换条件:[静态切配食材,无独立转换](本次由Java版迁入) 转换条件: 手持菜刀 右键 大蒜 需要右键三次 掉落 16个 蒜末(切配半成品)
17. 大蒜串 / 辣椒串 17. 大蒜串 / 辣椒串
转换条件:[静态串类食材,无独立转换](注:辣椒串原属烧烤分类,已迁至此分组) 配方(工作台): 大蒜x7 + 支杆x2 -> 大蒜串(garlicskewers); 辣椒x7 + 支杆x2 -> 辣椒串(chiliskewer)
18. 豆腐(beancurd) 18. 豆腐(beancurd)
转换条件:[静态食材,无独立转换](本次由Java版迁入) 转换条件:[静态食材,无独立转换](本次由Java版迁入)
@@ -118,30 +116,30 @@
八、裹粉半成品(油锅炸物前置,由生食材裹面粉而来) 八、裹粉半成品(油锅炸物前置,由生食材裹面粉而来)
======================================== ========================================
20. 生鱼片 -> 裹粉的鱼 20. 生鱼片 -> 裹粉的鱼
转换条件:[手持 面粉 右键 进行裹粉](【待确认】) 转换条件:[手持 生鱼片 右键 面粉块 进行裹粉]
机制: 生鱼片裹面粉,变为裹粉的鱼,供油锅炸鱼块 机制: 消耗6个生鱼片, 获得 1个 裹粉的鱼(oilfish_0), 供油锅炸鱼块
21. 龙虾 -> 裹粉的天妇罗 21. 龙虾 -> 裹粉的天妇罗
转换条件:[手持 面粉 右键 进行裹粉](【待确认】) 转换条件:[手持 龙虾 右键 面粉块 进行裹粉]
机制: 龙虾裹面粉,变为裹粉的天妇罗,供油锅炸天妇罗(天妇罗炸虾成品即由此而来) 机制: 消耗2个龙虾, 获得 1个 裹粉的天妇罗(oiltempura), 供油锅炸天妇罗(天妇罗炸虾成品即由此而来)
22. 猪肉 -> 裹粉的猪肉 22. 猪肉 -> 裹粉的猪肉
转换条件:[手持 面粉 右键 进行裹粉](【待确认】) 转换条件:[手持 原版猪肉 右键 面粉块 进行裹粉]
机制: 猪肉裹面粉,变为裹粉的猪肉,供油锅炸猪排 机制: 消耗1个猪肉, 获得 1个 裹粉的猪肉(oilpork), 供油锅炸猪排
23. 鸡块 -> 裹粉的鸡块 23. 鸡肉 -> 裹粉的鸡块
转换条件:[手持 面粉 右键 进行裹粉](【待确认】) 转换条件:[手持 原版生鸡肉 右键 面粉块 进行裹粉]
机制: 鸡块裹面粉,变为裹粉的鸡块,供油锅炸鸡块 机制: 消耗1个鸡肉, 获得 6个 裹粉的鸡块(oil_chickennuggets), 供油锅炸鸡块
24. 土豆条 -> 裹粉的薯条 24. 土豆 -> 裹粉的薯条
转换条件:[手持 面粉 右键 进行裹粉](【待确认】) 转换条件:[手持 土豆 右键 面粉块 进行裹粉]
机制: 土豆条裹面粉,变为裹粉的薯条,供油锅炸薯条 机制: 消耗1个土豆, 获得 10个 裹粉的薯条(oilfrenchfries), 供油锅炸薯条
======================================== ========================================
九、方块/物品清单(按8分组) 九、方块/物品清单(按8分组)
======================================== ========================================
【蔬菜·切配】cutcarrot_0~4(切胡萝卜)、cutpotato_0~4(切土豆)、cutvegetable_0~3(切青菜)、 【蔬菜·切配】cutcarrot_0~4(切胡萝卜)、cutpotato_0~4(切土豆)、cutvegetable_0~3(切青菜)、
cutscallions_1~4(葱花)、scallions(葱)、plantvegetables(青菜)、vegetable(青菜物品)、 cutscallions_1~4(葱花)、scallions(葱)、qingcai(青菜)、vegetable(青菜碎)、
crushed_carrots(胡萝卜碎)、crushed_scallions(葱花碎)、potato_wedges(土豆块) crushed_carrots(胡萝卜碎)、crushed_scallions(葱花碎)、potato_wedges(土豆块)
【肉类·肉馅】rawmeatball_0~3(生肉馅)、legsleep(羊腿)、sheeploins(羊里脊)、sheepracks(羊小排)、 【肉类·肉馅】rawmeatball_0~3(生肉馅)、legsleep(羊腿)、sheeploins(羊里脊)、sheepracks(羊小排)、
+46 -4
View File
@@ -324,10 +324,11 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher)
【缺失食材·已创建】(对比Java版, 已迁入基岩版行为包) 【缺失食材·已创建】(对比Java版, 已迁入基岩版行为包)
- 物品类(8个, 均归乡野食材/成品分类, 贴图/JSON/item_texture/lang 齐全): - 物品类(8个, 均归乡野食材/成品分类, 贴图/JSON/item_texture/lang 齐全):
胡萝卜碎(crushed_carrots)、葱花碎(crushed_scallions)、土豆块(potato_wedges)、 胡萝卜碎(crushed_carrots)、葱花碎(crushed_scallions)、土豆块(potato_wedges)、
奶油(cream_0)、稻谷(rice_seeds)、青菜物品(vegetable)、 奶油(cream_0)、稻谷(rice_seeds)、青菜(qingcai)、青菜碎(vegetable)、
饭团(rice_balls,乡野食物)、水煮蛋(boiled_egg,乡野食物) 饭团(rice_balls,乡野食物)、水煮蛋(boiled_egg,乡野食物)
- 青菜方块(plantvegetables): 已创建(参照切青菜模型), 归乡野食材/蔬菜·切配组, - 青菜物品(qingcai): 整颗未切青菜, 贴图 meiqiedeqingcai.png, 与原版放置衔接
与原版放置衔接(手持青菜物品右键放置→切青菜摆放地上) [已创建] (手持青菜物品右键放置→切青菜摆放地上); 原 vegetable 物品改名"青菜碎" [已调整]
- 青菜方块(plantvegetables): 已删除(不再使用原版态放置方块) [已删除]
【已放弃·不创建】(用户确认不迁入) 【已放弃·不创建】(用户确认不迁入)
- 鸡腿(raw_chicken_thighs)、鸡翅(raw_chicken_wings)、大饼(bannock) —— 已删除已建文件 - 鸡腿(raw_chicken_thighs)、鸡翅(raw_chicken_wings)、大饼(bannock) —— 已删除已建文件
@@ -337,7 +338,7 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher)
【食材分组·已落地】(ingredients_groups.json / xy_Ingredients.json / lang 三处同步) 【食材分组·已落地】(ingredients_groups.json / xy_Ingredients.json / lang 三处同步)
- 新建"食材堆"分组(ingr_09_pile): 土豆堆/胡萝卜堆/桃子堆/橙子堆/苹果堆/鸡蛋堆/鲑鱼堆/鳕鱼堆/面包堆 集中 - 新建"食材堆"分组(ingr_09_pile): 土豆堆/胡萝卜堆/桃子堆/橙子堆/苹果堆/鸡蛋堆/鲑鱼堆/鳕鱼堆/面包堆 集中
- 原"蔬果·堆类"(ingr_04_crop) 改名"蔬果·水果": 只留 葡萄/桃子/橙子(单个水果) - 原"蔬果·堆类"(ingr_04_crop) 改名"蔬果·水果": 只留 葡萄/桃子/橙子(单个水果)
- 新食材归组: 胡萝卜碎/葱花碎/土豆块/青菜/青菜方块→蔬菜·切配; 稻谷→谷物·米面; 奶油→调味·佐料 [已调整] - 新食材归组: 胡萝卜碎/葱花碎/土豆块/青菜/青菜碎→蔬菜·切配; 稻谷→谷物·米面; 奶油→调味·佐料 [已调整]
- 乡野食材转化关系.txt 重写纳入新食材(8分组+新食材+稻谷/奶油/切配半成品) [已整理] - 乡野食材转化关系.txt 重写纳入新食材(8分组+新食材+稻谷/奶油/切配半成品) [已整理]
- 关联补充: 稻谷→水稻种植(乡野自然)、土豆块→裹粉薯条(油锅) [已整理] - 关联补充: 稻谷→水稻种植(乡野自然)、土豆块→裹粉薯条(油锅) [已整理]
@@ -430,3 +431,44 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher)
【留后】果树"树苗成长"机制 见 全部功能没做什么.txt 乡野自然节 【留后】果树"树苗成长"机制 见 全部功能没做什么.txt 乡野自然节
########################################
【乡野食材·切配与裹粉】(xy_ingredients) 2026-09-08
########################################
实现于 xiangyemod/shicai (ShicaiData + ShicaiService, 注册到 FeatureDispatcher)
+ 原版放置扩展 (yuanbanfangzhi/YuanbanData)
一、原版放置(手持原版食材右键方块表面, 放置成"摆放地上"切配方块)
- 胡萝卜(minecraft:carrot) -> 切胡萝卜(摆放地上 cutcarrot_0) [已实现]
- 土豆(minecraft:potato) -> 切土豆(摆放地上 cutpotato_0) [已实现]
- 青菜(rtdd:qingcai) -> 切青菜(摆放地上 cutvegetable_0) [已实现]
- 葱(rtdd:scallions) -> 葱花_1(cutscallions_1) [已实现]
二、菜刀切分(手持 菜刀cleaver 右键, 逐级切, 最后一级再切掉碎)
- 切胡萝卜: cutcarrot_0 -> _1 -> _2 -> _3 -> _4, 再切 -> 掉3胡萝卜碎 + 变空气 [已实现]
- 切土豆: cutpotato_0 -> _1 -> _2 -> _3 -> _4, 再切 -> 掉3土豆块 + 变空气 [已实现]
- 切青菜: cutvegetable_0 -> _1 -> _2 -> _3, 再切 -> 掉3青菜碎(vegetable) + 变空气 [已实现]
- 葱花: cutscallions_1 -> _2 -> _3 -> _4, 再切 -> 掉3葱花碎 + 变空气 [已实现]
三、左键打碎切配方块 -> 掉原版食材(ShicaiService.handleDestroy)
- cutcarrot_0~4 -> 原版胡萝卜; cutpotato_0~4 -> 原版土豆 [已实现]
- cutvegetable_0~3 -> 青菜(qingcai); cutscallions_1~4 -> 葱(scallions) [已实现]
四、蒜末(手持 菜刀 右键 大蒜cutgarlic, 3次)
- 大蒜 -> 掉16蒜末(crushedgarlic) + 变空气 [已实现]
五、裹粉半成品(手持生食材右键 面粉块farineblock_3, 消耗面粉块变空气 + 掉落产物)
- 生鱼片(sashimi) x6 -> 裹粉的鱼(oilfish_0) x1 [已实现]
- 龙虾(lobster) x2 -> 裹粉的天妇罗(oiltempura) x1 [已实现]
- 原版猪肉 x1 -> 裹粉的猪肉(oilpork) x1 [已实现]
- 原版生鸡肉 x1 -> 裹粉的鸡块(oil_chickennuggets) x6 [已实现]
- 原版土豆 x1 -> 裹粉的薯条(oilfrenchfries) x10 [已实现]
六、工作台配方(netease_recipes)
- 大蒜串: 大蒜x7 + 支杆(b_34)x2 -> garlicskewers (xy_garlicskewers) [已实现]
- 辣椒串: 辣椒(pepper)x7 + 支杆x2 -> chiliskewer (xy_chiliskewer) [已实现]
- 桃子堆: 桃子(peach)x9 -> peachpile_0 (xy_peachpile_0) [已实现]
- 橙子堆: 橙子(orange)x9 -> orangepile_0 (xy_orangepile_0) [已实现]
(注: 苹果/面包/胡萝卜/鳕鱼/土豆/鲑鱼堆 为既有 8合1(中间空) 配方; 鸡蛋堆为 9满格;
分解配方待确认后补充, 见 全部功能没做什么.txt)
+1
View File
@@ -94,6 +94,7 @@
- 设想: 床, 但是可以两个人一起睡 - 设想: 床, 但是可以两个人一起睡
- 未做原因: 未实现 (家具家私转化关系.txt 静态段 todo 已标注) - 未做原因: 未实现 (家具家私转化关系.txt 静态段 todo 已标注)
厨具架 通过指针 所在 碰撞箱位置 取物品 比如左锅 右刀 指向哪个取哪个
######################################## ########################################
【乡野食物】(xy_food) 【乡野食物】(xy_food)