乡野自然实现 3

This commit is contained in:
wenhe committed 2026-09-08 11:28:14 +08:00
1 parent 97da44ab18
commit b947847def
9 files changed
+94 -83

No files matched your search

@@ -15,7 +15,7 @@ NaturalService / NaturalTimerService 读取,FeatureDispatcher 通过方块名/
5) 柴火分解 (工作台配方): firewood -> 9个木条
6) 水稻种植 (手持稻谷右键耕地): farmland -> 水稻刚种下
7) 水稻生长 (计时): riceseedlingsb -> c -> d
8) 水稻收获 (右键): 成熟水稻 -> 取16大米, 变回刚种下
8) 水稻收获 (左键破坏掉落): 水稻方块破坏掉稻谷, 成熟额外掉大米
【不实现(后续实现)】
- 果树"树苗成长"机制(树叶对应树苗, 像原版一样长成树): 后续实现, 本次跳过。
@@ -28,14 +28,14 @@ NaturalService / NaturalTimerService 读取,FeatureDispatcher 通过方块名/
# ============================================================================
# 一、柴火堆叠/取用(右键)
# firewood(柴火_1) + 手持柴火 -> firewood_2(柴火_2 堆放)
# firewood_2 空手右键 -> firewood + 给1个柴火
# firewood_2(柴火_2) + 手持柴火 -> firewood(柴火_1 堆放)
# firewood(堆放) 空手右键 -> firewood_2 + 给1个柴火
# ============================================================================
FIREWOOD_RULES = [
{"source": "rtdd:firewood", "item": "rtdd:firewood",
"target": "rtdd:firewood_2", "consume": 1, "tip": "§a堆放柴火"},
{"source": "rtdd:firewood_2", "item": None,
"target": "rtdd:firewood", "giveItem": "rtdd:firewood", "tip": "§a取走柴火"},
{"source": "rtdd:firewood_2", "item": "rtdd:firewood",
"target": "rtdd:firewood", "consume": 1, "tip": "§a堆放柴火"},
{"source": "rtdd:firewood", "item": None,
"target": "rtdd:firewood_2", "giveItem": "rtdd:firewood", "tip": "§a取走柴火"},
]
# ============================================================================
@@ -50,18 +50,19 @@ GRAPE_HARVEST = {
}
# ============================================================================
# 三、水稻收获(右键)
# riceseedlingsd(成熟) 空手右键 -> riceseedlingsb + 掉落16个大米
# 三、水稻收获(左键破坏掉落, 类似原版作物)
# 水稻方块被左键破坏 -> 掉落稻谷; 成熟(riceseedlingsd)额外掉大米
# ============================================================================
RICE_HARVEST = {
"source": "rtdd:riceseedlingsd", "item": None,
"target": "rtdd:riceseedlingsb",
"dropItem": [{"name": "rtdd:brownrice", "count": 16}],
"tip": "§a收获了16个大米",
}
RICE_BLOCKS = [
"rtdd:riceseedlingsb", # 刚种下
"rtdd:riceseedlingsc", # 生长中
"rtdd:riceseedlingsd", # 成熟
]
RICE_SEED_ITEM = "rtdd:rice_seeds" # 破坏掉落稻谷
RICE_CROP_ITEM = "rtdd:brownrice" # 成熟额外掉落大米
# 汇总: 乡野自然右键切换规则
NATURAL_SWITCHES = FIREWOOD_RULES + [GRAPE_HARVEST, RICE_HARVEST]
NATURAL_SWITCHES = FIREWOOD_RULES + [GRAPE_HARVEST]
# ============================================================================
# 四、计时转换 (果树结果 / 葡萄藤生长 / 水稻生长, 均 autoStart 自动生长)
@@ -32,7 +32,7 @@ from ....BlueFoxTools.SpecialFunciton.BlueFoxSystem import BlueFoxServerSystem
from ....BlueFoxTools.ToolsConfig import LevelId
# ---- 只导入乡野自然自己的数据库 ----
from ..NaturalData import NATURAL_SWITCHES, RICE_PLANT
from ..NaturalData import NATURAL_SWITCHES, RICE_PLANT, RICE_BLOCKS, RICE_SEED_ITEM, RICE_CROP_ITEM
# ---- 统一分发器 ----
from ...service.FeatureDispatcher import FeatureDispatcher
@@ -53,6 +53,9 @@ class NaturalService(BlueFoxServerSystem):
for r in NATURAL_SWITCHES:
self.switchRecipes[(r["source"], r.get("item"))] = r
self.featureBlocks.add(r["source"])
# 水稻方块: 只为接收"左键破坏掉落"事件注册(右键无规则, handleBlockUse 会返回 False)
for b in RICE_BLOCKS:
self.featureBlocks.add(b)
# ---- 右键冷却表 ----
self.cooldown = {}
@@ -92,6 +95,49 @@ class NaturalService(BlueFoxServerSystem):
self.handleSwitch(recipe, playerId, pos, dim, itemDict, key)
return True
def handleDestroy(self, args):
"""由 FeatureDispatcher 转发的"玩家左键破坏方块"入口(水稻收获, 类似原版作物)。
水稻方块(刚种下/生长中/成熟)被左键破坏 -> 掉落稻谷(1个, 回收种子);
成熟(riceseedlingsd)额外掉落 16 个大米(brownrice)。
返回 True=处理了; False=不属本功能管。"""
blockName = args.get("fullName") or args.get("blockName")
if blockName not in RICE_BLOCKS:
return False
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()
# 取消默认破坏+默认掉落(不让水稻方块本身掉出来)
args['cancel'] = True
args['spawnResources'] = False
# 清空方块为空气
try:
comp.CreateBlockInfo(LevelId).SetBlockNew(
pos, blockDict={"name": "minecraft:air", "aux": 0},
oldBlockHandling=0, dimensionId=dim)
except Exception:
pass
# 掉落稻谷(种子回收)
try:
self.CreateEngineItemEntity(
{"itemName": RICE_SEED_ITEM, "count": 1, "auxValue": 0},
dim, (x, y + 0.5, z))
except Exception:
pass
# 成熟水稻额外掉落大米
if blockName == "rtdd:riceseedlingsd":
try:
self.CreateEngineItemEntity(
{"itemName": RICE_CROP_ITEM, "count": 16, "auxValue": 0},
dim, (x, y + 0.5, z))
except Exception:
pass
return True
def handleItemUseOn(self, args):
"""由 FeatureDispatcher 转发的"手持物品右键方块表面"入口(稻谷种水稻)"""
itemName = args.get("itemName")