稻谷bug修复 提示删除

This commit is contained in:
wenhe committed 2026-09-29 16:25:50 +08:00
1 parent 344fad19ac
commit bd2ebfb154
43 files changed
+700 -846

No files matched your search

@@ -52,6 +52,9 @@ from ..siwangshengwu.service.DeadmobGeneratorService import DeadmobGeneratorServ
# ---- 钓鱼掉落: 螃蟹/龙虾(普通逻辑类, 由本分发器转发 PlayerFishingServerEvent) ----
from ..yuanbanfangzhi.service.YuanbanFishing import YuanbanFishingService
# ---- 乡野自然·水稻: 踩踏耕地等下方方块变化时 清理作物+掉稻谷 ----
from ..ziran.NaturalData import RICE_BLOCKS, RICE_SEED_ITEM, RICE_CROP_ITEM
# ---- 汤锅盛出自定义事件名(与客户端 ClientFeatureDispatcher TAKEOUT_EVENT 一致) ----
TAKEOUT_EVENT = "TakeoutRequest"
@@ -252,6 +255,10 @@ class FeatureDispatcher(BlueFoxServerSystem):
self.ListenForEvent(serverApi.GetEngineNamespace(),
serverApi.GetEngineSystemName(),
"ServerPlayerTryDestroyBlockEvent", self, self.OnDestroy)
# 水稻/自定义方块周围方块变化(踩踏耕地使下方变泥土/草地等) -> 清理作物+掉稻谷
self.ListenForEvent(serverApi.GetEngineNamespace(),
serverApi.GetEngineSystemName(),
"BlockNeighborChangedServerEvent", self, self.OnBlockNeighborChanged)
self.ListenForEvent(serverApi.GetEngineNamespace(),
serverApi.GetEngineSystemName(),
"ItemUseOnAfterServerEvent", self, self.OnItemPlaceAfter)
@@ -296,6 +303,9 @@ class FeatureDispatcher(BlueFoxServerSystem):
self.UnListenForEvent(serverApi.GetEngineNamespace(),
serverApi.GetEngineSystemName(),
"ServerPlayerTryDestroyBlockEvent", self, self.OnDestroy)
self.UnListenForEvent(serverApi.GetEngineNamespace(),
serverApi.GetEngineSystemName(),
"BlockNeighborChangedServerEvent", self, self.OnBlockNeighborChanged)
self.UnListenForEvent(serverApi.GetEngineNamespace(),
serverApi.GetEngineSystemName(),
"ItemUseOnAfterServerEvent", self, self.OnItemPlaceAfter)
@@ -739,3 +749,49 @@ class FeatureDispatcher(BlueFoxServerSystem):
self.CreateEngineItemEntity(itemDict, dim, (x, y + 0.5, z))
except Exception:
pass
def OnBlockNeighborChanged(self, args):
"""
BlockNeighborChangedServerEvent —— 自定义方块周围方块变化时触发。
用途: 稻谷(riceseedlingsb/c/d)下方是耕地(farmland)时, 一旦耕地被踩踏/替换/推动
(变成泥土/草方块等), 原版会把作物连根。为保证"踩耕地→作物消失且掉稻谷"(跟原版
一致, 而不掉方块本体), 这里在下方耕地变化的瞬间:
- 若稻谷方块仍存在于原地, 手动清空它;
- 并掉落稻谷(b/c 掉1; 成熟 d 掉 稻谷1 + 大米16)。
只处理稻谷块; 其余方块直接放行。
"""
blockName = args.get("blockName")
if blockName not in RICE_BLOCKS:
return
posX, posY, posZ = args.get("posX"), args.get("posY"), args.get("posZ")
dim = args.get("dimensionId")
# 仅当下方(正下方一格)方块变化才处理, 避免同层/上方邻居变化误清
if (args.get("neighborPosX") != posX or
args.get("neighborPosZ") != posZ or
args.get("neighborPosY") != (posY - 1)):
return
try:
below = comp.CreateBlockInfo(LevelId).GetBlockNew((posX, posY - 1, posZ), dim)
belowName = below.get("name") if below else None
except Exception:
belowName = None
# 下方仍是耕地 -> 不算失去支撑, 放行
if belowName == "minecraft:farmland":
return
# 清空作物方块(取消默认掉落, 手动掉)
try:
comp.CreateBlockInfo(LevelId).SetBlockNew(
(posX, posY, posZ), 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, (posX, posY + 0.5, posZ))
if blockName == "rtdd:riceseedlingsd":
self.CreateEngineItemEntity(
{"itemName": RICE_CROP_ITEM, "count": 16, "auxValue": 0},
dim, (posX, posY + 0.5, posZ))
except Exception:
pass
@@ -189,6 +189,17 @@ try:
except Exception:
pass
# 市场贸易(条箱/货桶/售卖盒 放入: 手持 苹果/胡萝卜/土豆/桃/橘/鳕鱼/鲑鱼/面包/南瓜/西瓜
# 右键空容器): MarketData.MARKET_SWITCHES。
# 手持这些"可放置/可食用"物品右键容器时, 原版会先播放放置/使用预览, 需纳入 BLOCKUSE_CANCEL
# 由客户端 cancel 后走 BlockUseRequest 到 MarketService.handleBlockUse, 实现"手中物品消失进容器"。
# 注意: 派生会自动过滤 item=None 的取出规则(空手取出走 ServerBlockUseEvent, 本就不受 itemUseOn 影响)。
try:
from ..shichangmaoyi.MarketData import MARKET_SWITCHES as MARKET_RS
_BLOCK_USE_TABLES.append(MARKET_RS)
except Exception:
pass
# ---- 原版放置/盘子转换 (itemUseOn, surface=相邻放置 / source=盘子) ----
try:
from ..yuanbanfangzhi.YuanbanData import (