diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/shousi/service/ShousiService.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/shousi/service/ShousiService.py index 2febeb8..89edfa1 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/shousi/service/ShousiService.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/shousi/service/ShousiService.py @@ -16,7 +16,7 @@ ├─ _handleCut ← 手持菜刀右键卷寿司两次 -> 寿司块(三个) └─ handleSwitch ← 通用转换(基础组/加鱼/卷制/手握/寿司堆/递减) handleItemUseOn ← 入口:手持饭团右键方块表面 -> 放置 手握普通寿司 - (通用工具) getCarriedItem / consumeItem / giveItem / replaceBlock / + (通用工具) getCarriedItem / consumeItem / dropItem / replaceBlock / checkCooldown ================================================================================ """ @@ -99,13 +99,13 @@ class ShousiService(BlueFoxServerSystem): "target": g["pile3"], "consume": STACK_CONSUME, "tip": g.get("pileTip"), } - # 递减: 空手右键, 每级取走一个, 退回卷寿司 + # 递减: 空手右键, 每级取走一个, 以掉落物形式退回卷寿司 self.recipes[(g["pile3"], None)] = { - "target": g["pile2"], "give": roll[-1], + "target": g["pile2"], "drop": roll[-1], "tip": g.get("takeTip"), } self.recipes[(g["pile2"], None)] = { - "target": roll[-1], "give": roll[-1], + "target": roll[-1], "drop": roll[-1], "tip": g.get("takeTip"), } self.featureBlocks.add(g["pile2"]) @@ -180,22 +180,32 @@ class ShousiService(BlueFoxServerSystem): return True def handleItemUseOn(self, args): - """由 FeatureDispatcher 转发的"手持物品右键方块表面"入口(饭团放置): - 手持饭团右键任意非寿司方块表面 -> 在表面上方放置 手握普通寿司。 + """由 FeatureDispatcher 转发的"手持物品右键方块表面"入口: + 1) 手持寿司方块物品 右键自家寿司方块 -> 取消默认放置(返回True), 交给 + handleBlockUse 处理(堆叠/卷制/加鱼/递减), 避免引擎先"放置"掉手持物品。 + 2) 手持饭团右键任意非寿司方块表面 -> 在表面上方放置 手握普通寿司。 返回 True=处理了; False=不属本功能管(交还其他服务/默认行为)。""" itemName = args.get("itemName") - if itemName != RICE_BALL: - return False 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() - # 被点方块若归寿司管辖(干海带/寿司等), 交给方块右键逻辑, 不在此放置 + # 被点方块名(用于区分"自家寿司方块"与"普通地面") + clickedName = None try: cur = comp.CreateBlockInfo(LevelId).GetBlockNew((x, y, z), dim) - if not cur or cur.get("name") in self.featureBlocks: - return False + clickedName = cur.get("name") if cur else None except Exception: + clickedName = None + + # 1) 手持寿司方块物品 右键 自家寿司方块: 取消默认放置 + if itemName in self.sushiBlockItems and clickedName in self.featureBlocks: + return True + + # 2) 饭团放置: 只对"非寿司方块"表面生效 + if itemName != RICE_BALL: + return False + if not clickedName or clickedName in self.featureBlocks: return False # 目标格 = 被点方块上方一格, 必须为空 @@ -281,15 +291,15 @@ class ShousiService(BlueFoxServerSystem): serverApi.GetMinecraftEnum().ItemPosType.CARRIED, 0, True) # ============================================================================ - # 六、工具方法:给玩家物品 + # 六、工具方法:以掉落物形式生成物品(递减取走返还) # ============================================================================ - def giveItem(self, playerId, itemName, count=1, aux=0): + def dropItem(self, dim, pos, itemName, count=1, aux=0): try: itemDict = {"itemName": itemName, "count": count, "auxValue": aux} - comp.CreateItem(playerId).SpawnItemToPlayerInv(itemDict, playerId) - except Exception: - pass + self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2])) + except Exception as e: + print "[Shousi-dropItem] FAIL", itemName, e # ============================================================================ # 七、工具方法:消耗物品 @@ -300,17 +310,23 @@ class ShousiService(BlueFoxServerSystem): return count = itemDict.get("count", 0) if count <= amount: - comp.CreateItem(playerId).SetEntityItem( - serverApi.GetMinecraftEnum().ItemPosType.CARRIED, - {"itemName": "minecraft:air", "count": 0, "auxValue": 0}) + try: + comp.CreateItem(playerId).SetEntityItem( + serverApi.GetMinecraftEnum().ItemPosType.CARRIED, + {"itemName": "minecraft:air", "count": 0, "auxValue": 0}) + except Exception as e: + print "[Shousi-consume] FAIL air", e 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", {})}) + try: + comp.CreateItem(playerId).SetEntityItem( + serverApi.GetMinecraftEnum().ItemPosType.CARRIED, + {"itemName": itemDict["newItemName"], + "count": itemDict["count"], + "auxValue": itemDict.get("newAuxValue", 0), + "userData": itemDict.get("userData", {})}) + except Exception as e: + print "[Shousi-consume] FAIL", e # ============================================================================ # 八、工具方法:替换方块(保留 aux, 兼容定向变体) diff --git a/tuilun/寿司转化关系.txt b/tuilun/ok/寿司转化关系.txt similarity index 100% rename from tuilun/寿司转化关系.txt rename to tuilun/ok/寿司转化关系.txt diff --git a/tuilun/全部功能做了什么.txt b/tuilun/全部功能做了什么.txt index d346aa2..1094315 100644 --- a/tuilun/全部功能做了什么.txt +++ b/tuilun/全部功能做了什么.txt @@ -536,7 +536,7 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher) - 热带鱼寿司(卷_4) -> 寿司堆(热带鱼_两个) -> 寿司堆(热带鱼_三个) [手持 热带鱼寿司(卷_4) 右键, 逐级堆叠, 每级消耗1个] [已实现] - 递减: 寿司堆(X_三个) -> 寿司堆(X_两个) -> 卷寿司 [空手右键, 逐级取走] - 机制: 每级取走一个并返还1个卷寿司; 鳕鱼/鲑鱼/热带鱼 同规则 [已实现] + 机制: 每级取走一个并以掉落物形式返还1个卷寿司; 鳕鱼/鲑鱼/热带鱼 同规则 [已实现] 七、盘装寿司组 (工作台合成) - 盘子 + 手握热带鱼寿司(三个) + 热带鱼寿司(卷_4) -> 盘装寿司(手握热带鱼三份+热带鱼寿司) (plate_27) [已实现] diff --git a/tuilun/全部功能没做什么.txt b/tuilun/全部功能没做什么.txt index 4a41930..2f9b442 100644 --- a/tuilun/全部功能没做什么.txt +++ b/tuilun/全部功能没做什么.txt @@ -190,6 +190,9 @@ - 手握鲑鱼寿司(三个) -> 手握鲑鱼寿司(两个) -> 手握鲑鱼寿司(一个) ->空 [空手右键 吃] (txt 15) - 手握热带鱼寿司(三个) -> 手握热带鱼寿司(两个) -> 手握热带鱼寿司(一个) ->空 [空手右键 吃] (txt 16) - 手握鱿鱼寿司(三个) -> 手握鱿鱼寿司(两个) -> 手握鱿鱼寿司(一个) ->空 [空手右键 吃] (txt 17) +- 盘装寿司 空手右键 吃: 盘装寿司(手握热带鱼三份+热带鱼寿司)(plate_27)、 + 盘装寿司(手握鳕鱼三份+鳕鱼寿司)(plate_28)、盘装寿司(手握鲑鱼三份+鲑鱼寿司)(plate_29)、 + 盘装寿司(手握鱿鱼三份+热带鱼寿司)(plate_42) - 未做原因: 均为"空手右键 吃"的食用递减, 食用部分由统一的"总食用功能"汇总实现, 本次不实现 (转化文档已用 todo 标注"吃的都 后续实现")