稻谷配置 配方txt 修改

This commit is contained in:
wenhe committed 2026-09-28 15:50:47 +08:00
1 parent 5f56d9b3db
commit 140e179e2b
10 files changed
+169 -176

No files matched your search

@@ -180,6 +180,15 @@ try:
except Exception:
pass
# ---- 乡野自然(种葡萄: 手持葡萄右键支杆): NaturalData.GRAPE_PLANT ----
# 葡萄是食物(eat 动画), 右键支杆会被原版当"吃/使用"前摇, 需纳入 BLOCKUse 取消消闪,
# 机制与烧烤上杆(cod/salmon 同为食物右键支杆)完全一致。
try:
from ..ziran.NaturalData import GRAPE_PLANT as NATURAL_GRAPE_PLANT
_BLOCK_USE_TABLES.append(NATURAL_GRAPE_PLANT)
except Exception:
pass
# ---- 原版放置/盘子转换 (itemUseOn, surface=相邻放置 / source=盘子) ----
try:
from ..yuanbanfangzhi.YuanbanData import (
@@ -352,9 +361,12 @@ ITEM_USE_ON_CANCEL = AUTO_CANCEL | SUSHI_CANCEL | COATING_CANCEL
# 七、纯手持物品取消: 只看手持item (不做方块匹配)
# ============================================================================
# ---- 原版相邻放置(YuanbanService ITEM_USE_ON_RULES) + 水稻种植(Natural RICE_PLANT) ----
# 手持这些"非方块食品/种子"右键任意方块表面, 都在相邻空位摆放对应切配方块。
# 它们本身不是可放置方块物品(放的是另一块), 但右键时会默认"吃/用", 需取消。
# ---- 原版相邻放置(YuanbanService ITEM_USE_ON_RULES) ----
# 手持这些"非方块食品"右键任意方块表面, 都在相邻空位摆放对应切配方块。
# 他们本身不是可放置方块物品(放的是另一块), 但右键时会默认"吃/用", 需取消。
# 注: 稻谷(rtdd:rice_seeds)不在此列 —— 它已改用物品 JSON 的 minecraft:seed 组件
# 由引擎原生种植(plant_at=farmland, crop_result=riceseedlingsb), 客户端不拦截,
# 否则会吞掉引擎的原生种植行为。
PLACE_ITEMS = {
"minecraft:chicken",
"minecraft:salmon",
@@ -364,7 +376,6 @@ PLACE_ITEMS = {
"minecraft:potato",
"rtdd:qingcai",
"rtdd:scallions",
"rtdd:rice_seeds", # 稻谷: 右键耕地相邻放置水稻苗(RICE_PLANT)
}
# ---- 总食用 手持直接吃 (Shiyongfood TRY_USE_RULES) ----
@@ -51,6 +51,12 @@ GRAPE_HARVEST = {
"tip": "§a取出了3个葡萄",
}
# 葡萄种植: 手持葡萄右键支杆 -> 葡萄藤_1(之后按原版 tick 随机生长, 无提示)
GRAPE_PLANT = {
"source": "rtdd:b_34", "item": "rtdd:grape",
"target": "rtdd:grapebushes_1", "consume": 1,
}
# ============================================================================
# 三、水稻收获(左键破坏掉落, 类似原版作物)
# 水稻方块被左键破坏 -> 掉落稻谷; 成熟(riceseedlingsd)额外掉大米
@@ -63,13 +69,19 @@ RICE_BLOCKS = [
RICE_SEED_ITEM = "rtdd:rice_seeds" # 破坏掉落稻谷
RICE_CROP_ITEM = "rtdd:brownrice" # 成熟额外掉落大米
# 水稻生长: 改用"原版 tick 概率生长"(每 block tick 一定概率长大一级) + 骨粉右键
# RICE_BLOCKS 顺序即生长阶段: [0]刚种 -> [1]生长中 -> [2]成熟
RICE_GROW_PROB = 0.001 # 每 block tick 生长一级的概率(原版随机式; 实测约20tick/秒, 每级≈50秒, 满熟≈1分40秒)
BONE_MEAL = "minecraft:bone_meal" # 骨粉(右键概率增加生长)
# 水稻/葡萄藤 生长: 都用"原版 tick 概率生长"(每 block tick 一定概率长大一级) + 骨粉右键
# 葡萄藤生长: 走"原版 tick 概率生长"代码(每 block tick 一定概率长大一级) + 骨粉右键。
# 稻谷(rice_seeds)已改用物品 JSON 的 minecraft:seed + 方块 base_block=custom_crop_block
# 的 netease:transform 由原版随机刻驱动生长(见 netease_blocks/riceseedlingsb,c.json),
# 不在此代码生长链里, 避免双重驱动。
GROW_CHAIN = {
"rtdd:grapebushes_1": "rtdd:grapebushes_2", # 葡萄藤_1 -> _2
} # 生长链: 当前方块 -> 长大一级后的方块, 供代码 tick 概率生长 + 骨粉催熟
GROW_PROB = 0.0003 # 每 block tick 长大一级的概率(原版随机式; 每级≈3分钟, 满熟数分钟~十来分钟)
BONE_MEAL = "minecraft:bone_meal" # 骨粉(右键对生长链方块催熟1级)
# 汇总: 乡野自然右键切换规则
NATURAL_SWITCHES = FIREWOOD_RULES + [GRAPE_HARVEST]
NATURAL_SWITCHES = FIREWOOD_RULES + [GRAPE_HARVEST, GRAPE_PLANT]
# ============================================================================
# 四、计时转换 (果树结果 / 葡萄藤生长 / 水稻生长, 均 autoStart 自动生长)
@@ -92,19 +104,12 @@ NATURAL_TIMERS = [
"time": 60, "autoStart": True},
{"source": "rtdd:tangerine_1", "target": "rtdd:tangerine_2",
"time": 60, "autoStart": True, "doneTip": "§e橘子熟了"},
# 葡萄藤: 藤_1 -> 藤_2
{"source": "rtdd:grapebushes_1", "target": "rtdd:grapebushes_2",
"time": 180, "autoStart": True, "doneTip": "§e葡萄熟了"},
# 水稻已改用"原版 tick 概率生长(每block tick随机长大一级)+骨粉", 见 NaturalTimerService._riceTickProcess,
# 不再走这里的秒式时长计时, 故从 NATURAL_TIMERS 移除
# 水稻/葡萄藤 已改用"原版 tick 概率生长(每block tick随机长大一级)+骨粉",
# 见 NaturalTimerService._growBlockProcess / GROW_CHAIN, 不再走这里的秒式时长, 故都不在此
]
# ============================================================================
# 五、水稻种植(手持稻谷右键耕地, 在耕地上方放置水稻刚种下)
# ============================================================================
RICE_PLANT = {
"item": "rtdd:rice_seeds", # 稻谷(手持)
"surface": "minecraft:farmland", # 必须右键原版耕地
"target": "rtdd:riceseedlingsb", # 放置水稻刚种下
"consume": 1,
}
# 五、水稻种植:已交由物品定义 JSON 的 minecraft:seed 组件处理
# (netease_items_beh/rtdd_rice_seeds.json: plant_at=[farmland],
# crop_result=rtdd:riceseedlingsb)。引擎原生支持"手持稻谷右键耕地"种植。
# ============================================================================
@@ -33,7 +33,7 @@ from ....BlueFoxTools.SpecialFunciton.BlueFoxSystem import BlueFoxServerSystem
from ....BlueFoxTools.ToolsConfig import LevelId
# ---- 只导入乡野自然自己的数据库 ----
from ..NaturalData import NATURAL_SWITCHES, RICE_PLANT, RICE_BLOCKS, RICE_SEED_ITEM, RICE_CROP_ITEM, BONE_MEAL
from ..NaturalData import NATURAL_SWITCHES, RICE_BLOCKS, RICE_SEED_ITEM, RICE_CROP_ITEM, BONE_MEAL, GROW_CHAIN
# ---- 统一分发器 ----
from ...service.FeatureDispatcher import FeatureDispatcher
@@ -54,9 +54,13 @@ class NaturalService(BlueFoxServerSystem):
for r in NATURAL_SWITCHES:
self.switchRecipes[(r["source"], r.get("item"))] = r
self.featureBlocks.add(r["source"])
# 水稻方块: 只为接收"左键破坏掉落"事件注册(右键无规则, handleBlockUse 会返回 False)
# 水稻方块: 只为接收"左键破坏掉落"事件注册; 右键无规则(返回 False),
# 其生长/骨粉由原版 base_block=custom_crop_block 的 transform 处理。
for b in RICE_BLOCKS:
self.featureBlocks.add(b)
# 葡萄藤_1: 供"手持骨粉右键催熟"路由进来(走代码 GROW_CHAIN)。
for b in GROW_CHAIN.keys():
self.featureBlocks.add(b)
# ---- 右键冷却表 ----
self.cooldown = {}
@@ -72,10 +76,6 @@ class NaturalService(BlueFoxServerSystem):
"""返回本功能管辖的所有右键方块名集合(右键路由用)"""
return self.featureBlocks
def getItemUseOnRules(self):
"""返回"手持物品右键方块表面"的规则: 稻谷(rice_seeds) → 种植水稻"""
return {RICE_PLANT["item"]: True}
def handleBlockUse(self, args):
"""由 FeatureDispatcher 转发的右键方块入口(柴火/葡萄收获/水稻收获)"""
blockName = args.get("blockName")
@@ -90,8 +90,9 @@ class NaturalService(BlueFoxServerSystem):
recipe = self.findRecipe(blockName, itemDict)
if not recipe:
# 骨粉右键水稻 -> 概率催熟(还原原版农作物施肥)
if itemName == BONE_MEAL and blockName in RICE_BLOCKS:
# 骨粉右键葡萄藤 -> 催熟一级(葡萄藤走代码 GROW_CHAIN)。
# 稻谷走原版 transform(引擎自带骨粉加速), 由 findRecipe 无规则则交给原版, 不在此拦。
if itemName == BONE_MEAL and blockName in GROW_CHAIN:
if self.checkCooldown(key, 0.3):
self._applyBoneMeal(playerId, pos, dim, blockName, itemDict)
return True
@@ -144,48 +145,6 @@ class NaturalService(BlueFoxServerSystem):
pass
return True
def handleItemUseOn(self, args):
"""由 FeatureDispatcher 转发的"手持物品右键方块表面"入口(稻谷种水稻)"""
itemName = args.get("itemName")
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()
if itemName != RICE_PLANT["item"]:
return False
# 被点方块必须是原版耕地
try:
cur = comp.CreateBlockInfo(LevelId).GetBlockNew((x, y, z), dim)
if not cur or cur.get("name") != RICE_PLANT["surface"]:
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, RICE_PLANT.get("consume", 1))
# 放置水稻刚种下
self.replaceBlock(targetPos, dim, RICE_PLANT["target"], playerId)
return True
# ============================================================================
# 二、规则匹配(精确 + 空手 fallback)
# ============================================================================
@@ -221,13 +180,14 @@ class NaturalService(BlueFoxServerSystem):
comp.CreateMsg(playerId).NotifyOneMessage(playerId, recipe["tip"])
def _applyBoneMeal(self, playerId, pos, dim, blockName, itemDict):
"""骨粉催熟水稻: 消耗1个骨粉, 让水稻长大一级(不越级, 到成熟为止), 无提示"""
"""骨粉催熟葡萄藤: 消耗1个骨粉, 沿 GROW_CHAIN 长大一级(不越级), 无提示。
稻谷骨粉由原版 transform 处理, 不经此。"""
try:
if blockName == RICE_BLOCKS[-1]:
return # 已成熟, 不再消耗
index = RICE_BLOCKS.index(blockName)
target = GROW_CHAIN.get(blockName)
if not target:
return # 不在生长链上(已是最终形态), 不消耗
self.consumeItem(playerId, itemDict, 1)
self.replaceBlock(pos, dim, RICE_BLOCKS[index + 1], playerId)
self.replaceBlock(pos, dim, target, playerId)
except Exception:
pass
@@ -38,7 +38,7 @@ from ....BlueFoxTools.ToolsConfig import LevelId
blockEntityDataComp = comp.CreateBlockEntityData(LevelId)
# ---- 只导入乡野自然自己的数据库 ----
from ..NaturalData import NATURAL_TIMERS, RICE_BLOCKS, RICE_GROW_PROB
from ..NaturalData import NATURAL_TIMERS, GROW_CHAIN, GROW_PROB
# ---- 统一分发器 ----
from ...service.FeatureDispatcher import FeatureDispatcher
@@ -66,7 +66,7 @@ class NaturalTimerService(BlueFoxServerSystem):
def getTimerBlocks(self):
"""返回本功能的所有"计时源方块"集合(tick 路由用)"""
blocks = set(self.naturalTimers.keys())
blocks.update(RICE_BLOCKS) # 水稻 tick 概率生长也要路由进来
blocks.update(GROW_CHAIN.keys()) # 葡萄藤 tick 概率生长路由进来(稻谷已改用原版 transform)
return blocks
def handleBlockEntityTick(self, args):
@@ -99,9 +99,9 @@ class NaturalTimerService(BlueFoxServerSystem):
def _tickProcess(self, dim, pos, blockName):
try:
# 水稻: 走"原版 tick 概率生长"(不是秒式时长)
if blockName in RICE_BLOCKS:
self._riceTickProcess(dim, pos, blockName)
# 水稻/葡萄藤: 走"原版 tick 概率生长"(不是秒式时长)
if blockName in GROW_CHAIN:
self._growBlockProcess(dim, pos, blockName)
return
recipe = self.naturalTimers.get(blockName)
if not recipe:
@@ -129,14 +129,14 @@ class NaturalTimerService(BlueFoxServerSystem):
except Exception:
pass
def _riceTickProcess(self, dim, pos, blockName):
"""水稻原版式 tick 生长: 每个 block tick 以 RICE_GROW_PROB 概率长大一级(到成熟为止)"""
def _growBlockProcess(self, dim, pos, blockName):
"""水稻/葡萄藤 原版式 tick 生长: 每个 block tick 以 GROW_PROB 概率沿 GROW_CHAIN 长大一级"""
try:
index = RICE_BLOCKS.index(blockName)
if index >= len(RICE_BLOCKS) - 1:
return # 已成熟
if random.random() < RICE_GROW_PROB:
self.replaceBlock(pos, dim, RICE_BLOCKS[index + 1], None)
target = GROW_CHAIN.get(blockName)
if not target:
return
if random.random() < GROW_PROB:
self.replaceBlock(pos, dim, target, None)
except Exception:
pass