diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/BlueFoxTools/SpecialFunciton/BlueFoxSystem.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/BlueFoxTools/SpecialFunciton/BlueFoxSystem.py index fa3c930..51d9714 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/BlueFoxTools/SpecialFunciton/BlueFoxSystem.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/BlueFoxTools/SpecialFunciton/BlueFoxSystem.py @@ -786,8 +786,8 @@ class BlueFoxServerSystem(serverBaseSystem): if userData: itemDict["userData"] = userData try: - # 1) 背包同类合并 - if self._mergeSameStackInv(playerId, itemName, count): + # 1) 背包同类合并(带 userData 的物品不合并, 避免附魔/药水数据被并错) + if not userData and self._mergeSameStackInv(playerId, itemName, count): return True # 2) 主手为空 -> 放主手 cur = self.getCarriedItem(playerId) diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/jiaju/service/FurnitureService.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/jiaju/service/FurnitureService.py index 5d94aa7..67d7f57 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/jiaju/service/FurnitureService.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/jiaju/service/FurnitureService.py @@ -354,11 +354,10 @@ class FurnitureService(BlueFoxServerSystem): """ 厨具架:放入/取回通用处理(任务五: 点哪边拿哪个)。 放入: 手持 锅铲/锅勺/菜刀/炒锅 右键空架/单件架 -> 按组合(顺序无关)成型 - 取回: 空手右键 -> 按点击位置(clickX/clickZ/face)判断点在左槽还是右槽, - 取下该槽对应厨具, 形态退回剩余单件/空。 - 槽位固定布局: 组合块模型的左槽 = KITCHENRACK_BLOCK_ITEMS[blockName][0], - 右槽 = [1] (与放入顺序无关, 以方块固态布局为准)。 - [注意] 左右判定依赖朝向, 若实测相反, 调 _rackSideFlip 即可翻转。 + 取回: 空手右键 -> 按方块朝向(aux)+命中坐标(clickX/clickZ)判断点在左槽还是右槽, + 取下该槽对应厨具, 形态退回剩余单件/空(与玩家站哪一侧无关)。 + 槽位固定布局: 组合块按 KITCHENRACK_BLOCK_ITEMS 的顺序 左=index0, 右=index1 + (以方块模型摆放为准, 与放入顺序无关)。左右映射见 _rackSideByClick。 """ click = click or {} # 槽位固定布局(左=index0, 右=index1); 单件=1个 @@ -394,7 +393,7 @@ class FurnitureService(BlueFoxServerSystem): pickedObj = _s break if pickedObj is not None: - self.giveItemObj(playerId, pickedObj) # 按持久化对象给(附魔保留) + self.giveItemObj(playerId, pickedObj, pos, dim) # 按持久化对象给(附魔保留) else: self.giveItemToPlayer(playerId, picked, 1, pos, dim, aux=0) self.replaceBlock(pos, dim, target, playerId) @@ -509,23 +508,23 @@ class FurnitureService(BlueFoxServerSystem): if recipe.get("discPut") and itemDict: self._writeDiscData(dim, pos, itemDict) - # ---- 掉落物(书柜取书/唱片取回) ---- + # ---- 掉落物(书柜取书/唱片取回): 走统一优先级(任务一) ---- if droppedBook is not None: - self._dropItemObj(dim, pos, droppedBook) + self._dropItemObj(dim, pos, droppedBook, playerId) if discToDrop: - self._dropItemDict(dim, pos, discToDrop) + self._dropItemDict(dim, pos, discToDrop, playerId) if recipe.get("dropItem"): - self.dropItems(dim, pos, recipe["dropItem"]) + self.dropItems(dim, pos, recipe["dropItem"], playerId) - # ---- 掉落物形式(水槽取水/取脏盘子/盘子架取回等) ---- - # 【根因C】获得物品一律改掉落物形式, 不再直接塞进背包 + # ---- 给物品(水槽取水/取脏盘子/盘子架取回/碗柜取碗等): 走统一优先级(任务一) ---- if recipe.get("giveItem"): _gItem = recipe["giveItem"] if isinstance(_gItem, dict): - self._dropItemDict(dim, pos, _gItem) + self._dropItemDict(dim, pos, _gItem, playerId) else: self._dropItemDict(dim, pos, - {"itemName": _gItem, "count": recipe.get("giveCount", 1), "auxValue": 0}) + {"itemName": _gItem, "count": recipe.get("giveCount", 1), "auxValue": 0}, + playerId) # ============================================================================ # 五、方块记录:count/stack 读写(箭桶/书柜, 字段 rtdd_sw*) @@ -703,8 +702,8 @@ class FurnitureService(BlueFoxServerSystem): except Exception: pass - def _dropItemDict(self, dim, pos, itemDict): - """以掉落物形式生成一个物品(唱片取回 / 箭桶取回等)""" + def _dropItemDict(self, dim, pos, itemDict, playerId=None): + """给出一个物品(唱片取回/箭桶取回等)。playerId 给出时走统一优先级(任务一)。""" try: outDict = {"itemName": itemDict["itemName"], "count": itemDict.get("count", 1), @@ -713,12 +712,17 @@ class FurnitureService(BlueFoxServerSystem): # 药水箭等带 userData(item额外数据, 如药水NBT)的物品: 一并重建到掉落物 if itemDict.get("userData"): outDict["userData"] = itemDict["userData"] + if playerId is not None: + self.giveItemToPlayer(playerId, outDict["itemName"], outDict["count"], + pos, dim, aux=outDict["auxValue"], + userData=outDict.get("userData")) + return self.CreateEngineItemEntity(outDict, dim, (pos[0], pos[1] + 0.5, pos[2])) except Exception: pass - def _dropItemObj(self, dim, pos, itemObj): - """以掉落物形式生成一个物品(书柜取书, 按扁平ench重建附魔)""" + def _dropItemObj(self, dim, pos, itemObj, playerId=None): + """给出一个物品(书柜取书, 按扁平ench重建附魔)。playerId 给出时走统一优先级(任务一)。""" try: itemDict = { "itemName": itemObj["itemName"], @@ -728,6 +732,11 @@ class FurnitureService(BlueFoxServerSystem): ench = itemObj.get("ench") if ench: itemDict["userData"] = self._buildEnchUserData(ench) + if playerId is not None: + self.giveItemToPlayer(playerId, itemDict["itemName"], itemDict["count"], + pos, dim, aux=itemDict["auxValue"], + userData=itemDict.get("userData")) + return self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2])) except Exception: pass @@ -750,18 +759,21 @@ class FurnitureService(BlueFoxServerSystem): """"给玩家物品": 统一走优先级(同类合并->主手->背包->掉落)""" self.giveItemToPlayer(playerId, itemName, count, aux=aux, userData=userData) - def giveItemObj(self, playerId, itemObj): - """按持久化物品对象给玩家(厨具架取回; 附魔书按扁平ench重建附魔)""" + def giveItemObj(self, playerId, itemObj, pos=None, dim=None): + """按持久化物品对象给玩家(厨具架取回; 附魔书按扁平ench重建附魔)。 + 统一优先级(任务一): 同类合并->主手->背包->掉落。""" try: - itemDict = {"itemName": itemObj["itemName"], - "count": itemObj.get("count", 1), - "auxValue": itemObj.get("aux", 0)} + itemName = itemObj["itemName"] + count = itemObj.get("count", 1) + aux = itemObj.get("aux", 0) + userData = None ench = itemObj.get("ench") if ench: - itemDict["userData"] = self._buildEnchUserData(ench) + userData = self._buildEnchUserData(ench) elif itemObj.get("userData"): - itemDict["userData"] = itemObj["userData"] - comp.CreateItem(playerId).SpawnItemToPlayerInv(itemDict, playerId) + userData = itemObj["userData"] + self.giveItemToPlayer(playerId, itemName, count, pos, dim, + aux=aux, userData=userData) except Exception: pass @@ -836,10 +848,10 @@ class FurnitureService(BlueFoxServerSystem): # 十一、工具方法:以掉落物形式生成物品(厨具架取回) # ============================================================================ - def dropItems(self, dim, pos, dropList): + def dropItems(self, dim, pos, dropList, playerId=None): """ dropList 格式:[{"name": "xxx", "count": N}, ...] - 在方块上方生成掉落物实体, 让它自然掉到地上。 + playerId 给出时走统一优先级(任务一: 同类合并->主手->背包->掉落)。 """ for d in dropList: itemDict = { @@ -847,7 +859,11 @@ class FurnitureService(BlueFoxServerSystem): "count": d.get("count", 1), "auxValue": d.get("aux", 0), } - self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2])) + if playerId is not None: + self.giveItemToPlayer(playerId, d["name"], d.get("count", 1), pos, dim, + aux=d.get("aux", 0)) + else: + self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2])) # ============================================================================ # 十二、工具方法:冷却检查 diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py index 7750655..8b80230 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py @@ -200,6 +200,16 @@ try: except Exception: pass +# 家具家私(碗柜放碗/水槽/盘子架/唱片机/垃圾桶/壁炉加柴 等): FurnitureData.FURNITURE_SWITCHES。 +# 手持 木碗/唱片/木条/打火石 等右键这些家具方块时, 原版会先播放放置/使用预览再被服务端取消 +# -> "闪一下"。纳入 BLOCKUSE_CANCEL 后由客户端提前 ret 并走 BlockUseRequest 到 +# FurnitureService.handleBlockUse, 消除闪动。item=None(取回) 会被派生自动过滤。 +try: + from ..jiaju.FurnitureData import FURNITURE_SWITCHES as FURNITURE_RS + _BLOCK_USE_TABLES.append(FURNITURE_RS) +except Exception: + pass + # ---- 原版放置/盘子转换 (itemUseOn, surface=相邻放置 / source=盘子) ---- try: from ..yuanbanfangzhi.YuanbanData import ( diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/ziran/service/NaturalService.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/ziran/service/NaturalService.py index 11c6b08..5257ff7 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/ziran/service/NaturalService.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/ziran/service/NaturalService.py @@ -174,9 +174,9 @@ class NaturalService(BlueFoxServerSystem): # 替换方块 if recipe.get("target"): self.replaceBlock(pos, dim, recipe["target"], playerId) - # 掉落物 + # 掉落物(任务一: 玩家主动获得 -> 统一优先级) if recipe.get("dropItem"): - self.dropItems(dim, pos, recipe["dropItem"]) + self.dropItems(dim, pos, recipe["dropItem"], playerId) # 给背包物品 if recipe.get("giveItem"): self.giveItem(playerId, recipe["giveItem"]) @@ -251,14 +251,19 @@ class NaturalService(BlueFoxServerSystem): # 八、工具方法:以掉落物形式生成物品 # ============================================================================ - def dropItems(self, dim, pos, dropList): + def dropItems(self, dim, pos, dropList, playerId=None): for d in dropList: itemDict = { "itemName": d["name"], "count": d.get("count", 1), "auxValue": d.get("aux", 0), } - self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2])) + if playerId is not None: + # 任务一: 玩家主动获得 -> 统一优先级(同类合并->主手->背包->掉落) + self.giveItemToPlayer(playerId, d["name"], d.get("count", 1), pos, dim, + aux=d.get("aux", 0)) + else: + self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2])) # ============================================================================ # 九、工具方法:冷却检查 diff --git a/resource_pack_Are13Lvd/texts/zh_CN.lang b/resource_pack_Are13Lvd/texts/zh_CN.lang index b5e5eb2..c43128b 100644 --- a/resource_pack_Are13Lvd/texts/zh_CN.lang +++ b/resource_pack_Are13Lvd/texts/zh_CN.lang @@ -776,7 +776,7 @@ tile.rtdd:eggcodsoup_1.name=汤锅_39(蛋花鳕鱼汤_四分熟) tile.rtdd:roujiamosoup_0.name=汤锅_77(羊肉泡馍汤_生) tile.rtdd:carrot_pile.name=胡萝卜堆_禁用 tile.rtdd:carrotsoup.name=汤锅_25(胡萝卜汤) -tile.rtdd:firewood_2.name=柴火_2 +tile.rtdd:firewood_2.name=半捆柴火 tile.rtdd:rawricepot.name=汤锅_71(生米锅) tile.rtdd:statueofadeity.name=神像 tile.rtdd:popsiclepile_3.name=冰棍堆2(橙子+西瓜+苹果) diff --git a/tuilun/ok/乡野自然转化关系.txt b/tuilun/ok/乡野自然转化关系.txt index ae7b504..06e21a5 100644 --- a/tuilun/ok/乡野自然转化关系.txt +++ b/tuilun/ok/乡野自然转化关系.txt @@ -44,9 +44,9 @@ todo 后续实现 转换条件:[空手 右键 取出] 机制: 成熟葡萄藤右键取出 3 个葡萄(grape), 变回葡萄藤_1 -5. 柴火_2 -> 柴火_1(堆放) -转换条件:[手持 柴火(rtdd:firewood) 右键 进行堆叠] -机制: 手持柴火右键柴火_2,消耗1个,堆叠成柴火_1(堆放) +5. 半捆柴火 -> 柴火 +转换条件:[手持 半捆柴火(rtdd:firewood_2) 右键 进行堆叠] +机制: 手持半捆柴火右键半捆柴火,消耗1个,堆叠成柴火 5a. 柴火_1(堆放) -> 柴火_2 转换条件:[空手 右键 进行转换,取走柴火]