乡野食材 功能实现 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.ziran.service.NaturalService import NaturalService
from xiangyemod.ziran.service.NaturalTimerService import NaturalTimerService
from xiangyemod.shicai.service.ShicaiService import ShicaiService
if not serverApi.IsInServer():
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,
"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), 盘子变为对应成品盘 ----
@@ -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_4",
"rtdd:scallions",
"rtdd:plantvegetables",
"rtdd:qingcai",
"rtdd:vegetable",
"rtdd:crushed_carrots",
"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",
"textures": "rtdd_blocks_vegetables"
},
"rtdd:plantvegetables": {
"netease_model": "rtdd:plantvegetables",
"sound": "grass",
"textures": "rtdd_blocks_vegetables"
},
"rtdd:cutvegetable_1": {
"netease_model": "rtdd:cutvegetable_1",
"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:cookingcookedporkloin.name=炒锅_30(小炒五花肉_生)
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:dumplingssoup.name=饺子_碗装
tile.rtdd:plate_17.name=生鱼片
@@ -249,7 +247,6 @@ tile.rtdd:b_108.name=古式唱片机(无碟)
tile.rtdd:balance.name=天平
tile.rtdd:b_109.name=古式唱片机(有碟)
tile.rtdd:plate_53.name=胡萝卜炒猪肉
tile.rtdd:plantvegetables.name=青菜_5(青菜)
tile.rtdd:plate_54.name=香菇滑鸡
tile.rtdd:plate_51.name=炸饺子
tile.rtdd:plate_52.name=土豆炒猪肉
@@ -846,7 +843,6 @@ tile.rtdd:cutvegetable_1.name=切青菜(切一刀)
tile.rtdd:b_269.name=橘木
tile.rtdd:bowlavegetablebeefsoup.name=清汤羊肉
tile.rtdd:cutvegetable_0.name=切青菜(摆放地上)
tile.rtdd:plantvegetables.name=青菜
tile.rtdd:garlicskewers.name=大蒜串
tile.rtdd:cookingcookedporkribs.name=炒锅_32(胡萝卜炒猪排骨_生)
tile.rtdd:fish_2.name=挂肉钩_6(鱼_2(禁用))
@@ -1243,6 +1239,7 @@ item.rtdd:crushed_scallions.name=葱花碎
item.rtdd:potato_wedges.name=土豆块
item.rtdd:cream_0.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:boiled_egg.name=水煮蛋
@@ -129,6 +129,9 @@
},
"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个, 生成"摆放地上"形态:
- 原版胡萝卜(minecraft:carrot) 右键放置 -> 切胡萝卜(摆放地上 cutcarrot_0)
- 原版土豆(minecraft:potato) 右键放置 -> 切土豆(摆放地上 cutpotato_0)
- 原版青菜(rtdd:vegetable, 青菜) 右键放置 -> 切青菜(摆放地上 cutvegetable_0)
- 原版青菜(rtdd:qingcai, 青菜) 右键放置 -> 切青菜(摆放地上 cutvegetable_0)
- 原版葱(rtdd:scallions, 葱) 右键放置 -> 葱花_1(cutscallions_1)
- 摆在地上的切配方块(切胡萝卜/切土豆/切青菜/葱花) 左键打碎 -> 掉落 原版食材(胡萝卜/土豆/青菜/葱)
1. 切胡萝卜(摆放地上) -> 切胡萝卜(切一块) -> 切胡萝卜(切两块) -> 切胡萝卜(切三块) -> 切胡萝卜(切四块)
转换条件:[手持 菜刀 右键 依次切割]
机制: 手持菜刀右键,每刀切一级,共四刀
1a. 切胡萝卜(切四块) -> 胡萝卜碎(crushed_carrots)
转换条件:[右键 进行转换(进一步切碎)]
机制: 切到四块后继续切, 变为 胡萝卜碎(切配半成品)【待确认: 具体切法】
转换条件:[手持 菜刀 右键 进行转换(进一步切碎)]
机制: 切到四块后继续切, 掉落 3个 胡萝卜碎
2. 切土豆(摆放地上) -> 切土豆(去皮) -> 切土豆(切一块) -> 切土豆(切两块) -> 切土豆(切三块)
转换条件:[手持 菜刀 右键 依次切割]
机制: 手持菜刀右键,先去皮再逐级切,共四刀
2a. 切土豆(切三块) -> 土豆块(potato_wedges)
转换条件:[右键 进行转换(切块)]
机制: 切到三块后继续切, 变为 土豆块(切配半成品, 供油锅炸薯条)【待确认: 具体切法】
转换条件:[手持 菜刀右键 进行转换(切块)]
机制: 切到三块后继续切, 掉落 3个 土豆块(切配半成品, 供油锅炸薯条)
3. 切青菜(摆放地上) -> 切青菜(切一刀) -> 切青菜(切两刀) -> 切青菜(切三刀)
转换条件:[手持 菜刀 右键 依次切割]
机制: 手持菜刀右键,每刀切一级,共三刀
3a. 切青菜(切三刀) -> 青菜碎(rtdd:vegetable)
转换条件:[手持 菜刀 右键 进行转换(进一步切碎)]
机制: 切到三刀后继续切, 掉落 3个 青菜碎(切配半成品)
4. 葱花_1 -> 葱花_2 -> 葱花_3 -> 葱花_4
转换条件:[手持 菜刀 右键 依次切分葱]
机制: 手持菜刀右键切葱,逐级切分
4a. 葱花_4 -> 葱花碎(crushed_scallions)
转换条件:[右键 进行转换(进一步切碎)]
机制: 切到葱花_4后继续切, 变为 葱花碎(切配半成品)【待确认: 具体切法】
转换条件:[手持 菜刀 右键 进行转换(进一步切碎)]
机制: 切到葱花_4后继续切, 掉落 3个 葱花碎(切配半成品)
5. 葱(scallions)
转换条件:[静态食材,无独立转换](本次由Java版迁入,用于炒锅加葱/葱花锅底)
5a. 青菜(原版, plantvegetables/vegetable)
放置: 手持葱右键 -> 葱花_1(cutscallions_1)
5a. 青菜(qingcai)
转换条件:[静态食材,无独立转换]
机制: 原版不切状态, 手持右键放置后成为切青菜(摆放地上), 再菜刀切分 [已从Java版迁入]
@@ -75,11 +78,9 @@
========================================
四、食材堆(各类堆叠食材集中分组)
========================================
10. 土豆堆 / 胡萝卜堆(b_40) / 桃子堆 / 橙子堆 / 苹果堆 / 鸡蛋堆 / 鲑鱼堆 / 鳕鱼堆 / 面包堆
10. 土豆堆 / 胡萝卜堆/ 桃子堆 / 橙子堆 / 苹果堆 / 鸡蛋堆 / 鲑鱼堆 / 鳕鱼堆 / 面包堆
转换条件:[静态堆叠食材,无独立转换]
说明: 各类"XX堆"集中到本组"食材堆"(含原鱼·海鲜的鲑鱼堆/鳕鱼堆、原谷物·米面的面包堆)
- 鸡蛋堆(egg_pile)仍属食材堆, 供鸡窝/蛋液/汤锅煮鸡蛋(raweggsoup)/蛋花汤(eggsoup)/炒锅煎蛋(cookedegg)等使用
配方(工作台): 九个对应食材 合成 堆; 堆 放工作台 分解成 九个对应食材
========================================
五、蔬果·水果(单个水果, 供榨汁/冰棍/炒冰)
========================================
@@ -93,9 +94,6 @@
转换条件:[静态食材,无独立转换](本次由Java版迁入,用于生米锅/米饭/竹筒饭/蛋炒饭;
米饭需先经 汤锅 煮熟盛出, 再做寿司(含饭团 rice_balls)/蛋炒饭等)
13. 生面(noodles)
转换条件:[静态食材,无独立转换](本次由Java版迁入,归本组,用作汤锅生面汤/炒锅意面的面条食材)
========================================
七、调味·佐料
========================================
@@ -103,10 +101,10 @@
转换条件:[静态切配食材,无独立转换]
16. 蒜末(crushedgarlic)
转换条件:[静态切配食材,无独立转换](本次由Java版迁入)
转换条件: 手持菜刀 右键 大蒜 需要右键三次 掉落 16个 蒜末(切配半成品)
17. 大蒜串 / 辣椒串
转换条件:[静态串类食材,无独立转换](注:辣椒串原属烧烤分类,已迁至此分组)
配方(工作台): 大蒜x7 + 支杆x2 -> 大蒜串(garlicskewers); 辣椒x7 + 支杆x2 -> 辣椒串(chiliskewer)
18. 豆腐(beancurd)
转换条件:[静态食材,无独立转换](本次由Java版迁入)
@@ -118,30 +116,30 @@
八、裹粉半成品(油锅炸物前置,由生食材裹面粉而来)
========================================
20. 生鱼片 -> 裹粉的鱼
转换条件:[手持 面粉 右键 进行裹粉](【待确认】)
机制: 生鱼片裹面粉,变为裹粉的鱼,供油锅炸鱼块
转换条件:[手持 生鱼片 右键 面粉块 进行裹粉]
机制: 消耗6个生鱼片, 获得 1个 裹粉的鱼(oilfish_0), 供油锅炸鱼块
21. 龙虾 -> 裹粉的天妇罗
转换条件:[手持 面粉 右键 进行裹粉](【待确认】)
机制: 龙虾裹面粉,变为裹粉的天妇罗,供油锅炸天妇罗(天妇罗炸虾成品即由此而来)
转换条件:[手持 龙虾 右键 面粉块 进行裹粉]
机制: 消耗2个龙虾, 获得 1个 裹粉的天妇罗(oiltempura), 供油锅炸天妇罗(天妇罗炸虾成品即由此而来)
22. 猪肉 -> 裹粉的猪肉
转换条件:[手持 面粉 右键 进行裹粉](【待确认】)
机制: 猪肉裹面粉,变为裹粉的猪肉,供油锅炸猪排
转换条件:[手持 原版猪肉 右键 面粉块 进行裹粉]
机制: 消耗1个猪肉, 获得 1个 裹粉的猪肉(oilpork), 供油锅炸猪排
23. 鸡块 -> 裹粉的鸡块
转换条件:[手持 面粉 右键 进行裹粉](【待确认】)
机制: 鸡块裹面粉,变为裹粉的鸡块,供油锅炸鸡块
23. 鸡肉 -> 裹粉的鸡块
转换条件:[手持 原版生鸡肉 右键 面粉块 进行裹粉]
机制: 消耗1个鸡肉, 获得 6个 裹粉的鸡块(oil_chickennuggets), 供油锅炸鸡块
24. 土豆条 -> 裹粉的薯条
转换条件:[手持 面粉 右键 进行裹粉](【待确认】)
机制: 土豆条裹面粉,变为裹粉的薯条,供油锅炸薯条
24. 土豆 -> 裹粉的薯条
转换条件:[手持 土豆 右键 面粉块 进行裹粉]
机制: 消耗1个土豆, 获得 10个 裹粉的薯条(oilfrenchfries), 供油锅炸薯条
========================================
九、方块/物品清单(按8分组)
========================================
【蔬菜·切配】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(土豆块)
【肉类·肉馅】rawmeatball_0~3(生肉馅)、legsleep(羊腿)、sheeploins(羊里脊)、sheepracks(羊小排)、
+46 -4
View File
@@ -324,10 +324,11 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher)
【缺失食材·已创建】(对比Java版, 已迁入基岩版行为包)
- 物品类(8个, 均归乡野食材/成品分类, 贴图/JSON/item_texture/lang 齐全):
胡萝卜碎(crushed_carrots)、葱花碎(crushed_scallions)、土豆块(potato_wedges)、
奶油(cream_0)、稻谷(rice_seeds)、青菜物品(vegetable)、
奶油(cream_0)、稻谷(rice_seeds)、青菜(qingcai)、青菜碎(vegetable)、
饭团(rice_balls,乡野食物)、水煮蛋(boiled_egg,乡野食物)
- 青菜方块(plantvegetables): 已创建(参照切青菜模型), 归乡野食材/蔬菜·切配组,
与原版放置衔接(手持青菜物品右键放置→切青菜摆放地上) [已创建]
- 青菜物品(qingcai): 整颗未切青菜, 贴图 meiqiedeqingcai.png, 与原版放置衔接
(手持青菜物品右键放置→切青菜摆放地上); 原 vegetable 物品改名"青菜碎" [已调整]
- 青菜方块(plantvegetables): 已删除(不再使用原版态放置方块) [已删除]
【已放弃·不创建】(用户确认不迁入)
- 鸡腿(raw_chicken_thighs)、鸡翅(raw_chicken_wings)、大饼(bannock) —— 已删除已建文件
@@ -337,7 +338,7 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher)
【食材分组·已落地】(ingredients_groups.json / xy_Ingredients.json / lang 三处同步)
- 新建"食材堆"分组(ingr_09_pile): 土豆堆/胡萝卜堆/桃子堆/橙子堆/苹果堆/鸡蛋堆/鲑鱼堆/鳕鱼堆/面包堆 集中
- 原"蔬果·堆类"(ingr_04_crop) 改名"蔬果·水果": 只留 葡萄/桃子/橙子(单个水果)
- 新食材归组: 胡萝卜碎/葱花碎/土豆块/青菜/青菜方块→蔬菜·切配; 稻谷→谷物·米面; 奶油→调味·佐料 [已调整]
- 新食材归组: 胡萝卜碎/葱花碎/土豆块/青菜/青菜碎→蔬菜·切配; 稻谷→谷物·米面; 奶油→调味·佐料 [已调整]
- 乡野食材转化关系.txt 重写纳入新食材(8分组+新食材+稻谷/奶油/切配半成品) [已整理]
- 关联补充: 稻谷→水稻种植(乡野自然)、土豆块→裹粉薯条(油锅) [已整理]
@@ -430,3 +431,44 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher)
【留后】果树"树苗成长"机制 见 全部功能没做什么.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 已标注)
厨具架 通过指针 所在 碰撞箱位置 取物品 比如左锅 右刀 指向哪个取哪个
########################################
【乡野食物】(xy_food)