From 23598ed3ddf7d427ca31d208d9285f1a0b39a2a6 Mon Sep 17 00:00:00 2001 From: wenhe <1046926120@qq.com> Date: Thu, 24 Sep 2026 15:35:27 +0800 Subject: [PATCH] =?UTF-8?q?kill=E6=9D=80=E6=AD=BB=E4=B8=8D=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=B0=B8=E4=BD=93(=E5=8F=AF=E7=94=A8=E7=89=88?= =?UTF-8?q?=E6=9C=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xiangyemod/chuju/ChujuData.py | 5 ++ .../xiangyemod/chuju/service/ChujuService.py | 77 +++++++++++++++++-- .../xiangyemod/service/FeatureDispatcher.py | 31 ++++++++ .../service/DeadmobGeneratorService.py | 8 ++ tuilun/配方整理汇总.txt | 12 +++ 5 files changed, 125 insertions(+), 8 deletions(-) diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/chuju/ChujuData.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/chuju/ChujuData.py index 4f333db..c788f83 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/chuju/ChujuData.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/chuju/ChujuData.py @@ -108,9 +108,14 @@ BEATER_BLOCKS = [ # ============================================================================ SOYBEAN_ITEM = "rtdd:soybean" # 黄豆 SOYBEAN_COUNT = 16 # 磨一次要16个黄豆 +WHEAT_ITEM = "minecraft:wheat" # 小麦(磨面原料) +WHEAT_COUNT = 6 # 磨一次要6个小麦 +FLOUR_ITEM = "rtdd:farineblcok" # 面粉(石磨产物, 方块物品) STONEMILL_GRIND_COUNT = 4 # 右键4次完成研磨 GLASS_TANK_ITEM = "rtdd:medicinetank" # 玻璃罐(取出油罐) OIL_CAN_ITEM = "rtdd:oilcan" # 油罐(石磨产物) +# 石磨材料标识(存方块实体 rtdd_stm): 'soybean'=黄豆, 'wheat'=小麦 +STONEMILL_MATERIAL_KEY = "rtdd_stm" # ============================================================================ # 四B、手持厨具物品(七、手持厨具物品): 锅铲 <-> 带油锅铲, 油罐蘸油/上油炒锅 diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/chuju/service/ChujuService.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/chuju/service/ChujuService.py index 30f4a88..8325f09 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/chuju/service/ChujuService.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/chuju/service/ChujuService.py @@ -46,7 +46,8 @@ from ..ChujuData import ( STOVE_RULES, MEATBALLMAKER_RULES, MEATBALL_TIMERS, MEAT_ITEMS, MILK_ITEM, BUCKET_ITEM, EGG_ITEM, BOWL_ITEM, PLATE_ITEM, CREAM_ITEM, EGG_CUSTARD_ITEM, BEATER_BLOCKS, - SOYBEAN_ITEM, SOYBEAN_COUNT, STONEMILL_GRIND_COUNT, + SOYBEAN_ITEM, SOYBEAN_COUNT, WHEAT_ITEM, WHEAT_COUNT, + FLOUR_ITEM, STONEMILL_GRIND_COUNT, STONEMILL_MATERIAL_KEY, GLASS_TANK_ITEM, OIL_CAN_ITEM, STEAMER_RULES, SPATULA, SPATULA_OIL, WOK, OIL_PAN, OIL_CAN_USES, ) @@ -541,14 +542,17 @@ class ChujuService(BlueFoxServerSystem): playerId = args.get("playerId") x, y, z = args.get("x"), args.get("y"), args.get("z") dim = comp.CreateDimension(playerId).GetEntityDimensionId() - # 读取研磨进度;None 或 <0(已清豆/-1) = 空石磨 + # 读取研磨进度与材料;None 或 <0(已清豆/-1) = 空石磨 prog = self._readMill((x, y, z), dim) if prog is None or prog < 0: return False - # 有黄豆:额外掉落16个(石磨本体由默认破坏掉落) + mat = self._readMillMat((x, y, z), dim) or "soybean" + ret = FLOUR_ITEM if mat == "wheat" else SOYBEAN_ITEM + count = WHEAT_COUNT if mat == "wheat" else SOYBEAN_COUNT + # 有材料:额外掉落对应原料(石磨本体由默认破坏掉落) try: self.CreateEngineItemEntity( - {"itemName": SOYBEAN_ITEM, "count": SOYBEAN_COUNT, "auxValue": 0}, + {"itemName": ret, "count": count, "auxValue": 0}, dim, (x, y + 0.5, z)) except Exception: pass @@ -556,9 +560,23 @@ class ChujuService(BlueFoxServerSystem): def _handleStonemill(self, playerId, pos, dim, itemDict, itemName, key): prog = self._readMill(pos, dim) # None=空, 0~3=研磨中, 4=完成 + mat = self._readMillMat(pos, dim) or "soybean" # 默认黄豆; 'wheat'=小麦 - # ---- 空石磨 + 黄豆(16) -> 加入黄豆 ---- + # ---- 空石磨 + 黄豆(16) 或 小麦(6) -> 加入 ---- if prog is None: + if itemName == WHEAT_ITEM: + if (itemDict.get("count") or 0) < WHEAT_COUNT: + comp.CreateMsg(playerId).NotifyOneMessage( + playerId, "§c需要 %d 个小麦" % WHEAT_COUNT) + return True + if not self.checkCooldown(key, 0.5): + return True + self.consumeItem(playerId, itemDict, WHEAT_COUNT) + self._writeMillMat(dim, pos, "wheat") + self._writeMill(dim, pos, 0) + comp.CreateMsg(playerId).NotifyOneMessage( + playerId, "§a加入小麦,空手右键研磨") + return True if itemName == SOYBEAN_ITEM: if (itemDict.get("count") or 0) < SOYBEAN_COUNT: comp.CreateMsg(playerId).NotifyOneMessage( @@ -567,6 +585,7 @@ class ChujuService(BlueFoxServerSystem): if not self.checkCooldown(key, 0.5): return True self.consumeItem(playerId, itemDict, SOYBEAN_COUNT) + self._writeMillMat(dim, pos, "soybean") self._writeMill(dim, pos, 0) comp.CreateMsg(playerId).NotifyOneMessage( playerId, "§a加入黄豆,空手右键研磨") @@ -583,15 +602,28 @@ class ChujuService(BlueFoxServerSystem): self._rotateMill(pos, dim) self._writeMill(dim, pos, newProg) if newProg >= STONEMILL_GRIND_COUNT: - comp.CreateMsg(playerId).NotifyOneMessage( - playerId, "§a研磨完成,可加玻璃罐取油") + tip = "§a研磨完成,可空手取出 面粉" if mat == "wheat" \ + else "§a研磨完成,可加玻璃罐取油" + comp.CreateMsg(playerId).NotifyOneMessage(playerId, tip) else: comp.CreateMsg(playerId).NotifyOneMessage( playerId, "§a研磨中,(%d/%d)" % (newProg, STONEMILL_GRIND_COUNT)) return True - # ---- 完成: + 玻璃罐 -> 油罐 ---- + # ---- 完成 ---- if prog >= STONEMILL_GRIND_COUNT: + if mat == "wheat": + # 小麦已磨成面粉: 空手右键 -> 掉落 1 面粉 + 还原空 + if itemName and itemName != "minecraft:air": + return False + if not self.checkCooldown(key, 0.5): + return True + self.dropItems(dim, pos, [{"name": FLOUR_ITEM, "count": 1}]) + self._clearMill(dim, pos) + comp.CreateMsg(playerId).NotifyOneMessage( + playerId, "§a取出了面粉") + return True + # 黄豆: + 玻璃罐 -> 油罐 if itemName == GLASS_TANK_ITEM: if not self.checkCooldown(key, 0.5): return True @@ -666,11 +698,40 @@ class ChujuService(BlueFoxServerSystem): except Exception: return None + def _writeMillMat(self, dim, pos, mat): + """写入石磨材料标识('soybean'/'wheat')""" + try: + data = blockEntityDataComp.GetBlockEntityData(dim, pos) + if data is None: + gameComp.AddTimer(0.1, self._writeMillMatDelayed, dim, pos, mat) + return + data[STONEMILL_MATERIAL_KEY] = str(mat) + except Exception: + gameComp.AddTimer(0.1, self._writeMillMatDelayed, dim, pos, mat) + + def _writeMillMatDelayed(self, dim, pos, mat): + try: + data = blockEntityDataComp.GetBlockEntityData(dim, pos) + if data is not None: + data[STONEMILL_MATERIAL_KEY] = str(mat) + except Exception: + pass + + def _readMillMat(self, pos, dim): + try: + data = blockEntityDataComp.GetBlockEntityData(dim, pos) + if data is None: + return None + return data[STONEMILL_MATERIAL_KEY] + except Exception: + return None + def _clearMill(self, dim, pos): try: data = blockEntityDataComp.GetBlockEntityData(dim, pos) if data is not None: data["rtdd_mill"] = -1 + data[STONEMILL_MATERIAL_KEY] = None except Exception: pass diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py index 0d51674..6ce95b7 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py @@ -33,6 +33,7 @@ ================================================================================ """ import time +import random import mod.server.extraServerApi as serverApi # ---- 网易API基础对象 ---- @@ -252,6 +253,9 @@ class FeatureDispatcher(BlueFoxServerSystem): self.ListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(), "MobDieEvent", self, self.OnEntityDie) + self.ListenForEvent(serverApi.GetEngineNamespace(), + serverApi.GetEngineSystemName(), + "PlayerFishingServerEvent", self, self.OnFishing) # 7. TakeoutRequest —— 客户端拦截(碗/盘,汤锅/炒锅/油锅成品)放置预览后, 显式请求服务端盛出。 # 客户端系统 ClientFeatureDispatcher 用 NotifyToServer(TAKEOUT_EVENT) 发送, # 服务端以 MOD_NAME + 客户端系统名 监听该自定义事件。 @@ -293,6 +297,9 @@ class FeatureDispatcher(BlueFoxServerSystem): self.UnListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(), "MobDieEvent", self, self.OnEntityDie) + self.UnListenForEvent(serverApi.GetEngineNamespace(), + serverApi.GetEngineSystemName(), + "PlayerFishingServerEvent", self, self.OnFishing) self.UnListenForEvent(MOD_NAME, "ClientFeatureDispatcher", TAKEOUT_EVENT, self, self.OnTakeoutRequest) self.UnListenForEvent(MOD_NAME, "ClientFeatureDispatcher", @@ -666,6 +673,30 @@ class FeatureDispatcher(BlueFoxServerSystem): except Exception as e: print "[FD-OnEntityDie-ERR]", e + def OnFishing(self, args): + """ + 玩家收杆时、钓鱼掉落物生成前触发(PlayerFishingServerEvent)。 + 让 螃蟹(rtdd:crab)/龙虾(rtdd:lobster) 直接作为"钓上来的物品": + 有几率把本次钓上来的东西【替换】成 螃蟹 或 龙虾 —— 不再像 After 事件那样 + 额外多掉一只, 更贴近原版"钓上来什么就是什么"。 + args.关键字段: playerId / hookEntity / itemList(本次钓上的物品列表, 生成前可改)。 + 概率(草稿, 可调): 螃蟹 10% / 龙虾 6%。 + """ + try: + playerId = args.get("playerId") + itemList = args.get("itemList") + if not playerId or not isinstance(itemList, list) or not itemList: + return + # 【测试用】概率 100%: 每次收杆都替换成 螃蟹/龙虾(50/50), 方便验证两者都能钓到。 + # 测试完请调回(如 螃蟹0.10 / 龙虾0.06)。 + if random.random() < 0.5: + sea = "rtdd:crab" + else: + sea = "rtdd:lobster" + args["itemList"] = [{"itemName": sea, "count": 1, "auxValue": 0}] + except Exception as e: + print "[FD-OnFishing-ERR]", e + def OnDestroy(self, args): """ 玩家拆方块时触发。 diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/siwangshengwu/service/DeadmobGeneratorService.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/siwangshengwu/service/DeadmobGeneratorService.py index 308787c..7a544d6 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/siwangshengwu/service/DeadmobGeneratorService.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/siwangshengwu/service/DeadmobGeneratorService.py @@ -37,6 +37,10 @@ from ....BlueFoxTools.ToolsConfig import LevelId # ---- 尸体生成延迟(秒): 死亡 1.5 秒后才生成尸体方块, 不会刚死瞬间就出现 ---- GEN_DELAY = 1.5 +# ---- 只有"被玩家攻击"死的才算: 近战=entity_attack, 远程(弓箭等)=projectile。 +# 排除 kill/指令(self_destruct) 以及摔/溺/火/爆炸等非玩家攻击的死亡。 ---- +ATTACK_CAUSES = {"entity_attack", "projectile"} + class DeadmobGeneratorService(object): """ @@ -63,6 +67,10 @@ class DeadmobGeneratorService(object): attackerId = args.get("attacker") or args.get("attackedByEntId") if not killedId or not attackerId: return + # 必须是"玩家攻击"死亡(近战 entity_attack / 远程 projectile)。 + # 排除 kill/指令(self_destruct) 及摔/溺/火等一切非玩家攻击的死亡。 + if args.get("cause") not in ATTACK_CAUSES: + return # 解析"由玩家击杀": 近战 attacker 就是玩家; 远程 attacker 是抛射物, 取其发射者 if not self._resolvePlayerAttacker(attackerId): return diff --git a/tuilun/配方整理汇总.txt b/tuilun/配方整理汇总.txt index 3abaeb0..59adb13 100644 --- a/tuilun/配方整理汇总.txt +++ b/tuilun/配方整理汇总.txt @@ -63,6 +63,11 @@ 【空】 【空】 【空】 【空】 【空】 【空】 +● 挂肉钩(meathook)【有序】 + 支撑杆 + 铁锭 + (支杆=rtdd:support_rod) + ######################################################################## 四、厨具 (xy_kitchenware) ######################################################################## @@ -383,6 +388,13 @@ ● 支撑杆(support_rod) x2 配方3【有序】(3 木板条) 木板条 木板条 木板条 +######################################################################## +二十、面食 (xy_mianshi) —— 新增 +######################################################################## +● 竹筒(bamboo_0)【有序】 + 竹子 竹子 竹子 + (3 原版竹子 -> 1 竹筒, 供竹筒饭) + ======================================================================== 附注 ========================================================================