diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/BlueFoxTools/SpecialFunciton/BlueFoxRuckSackEngine.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/BlueFoxTools/SpecialFunciton/BlueFoxRuckSackEngine.py index 40643ab..792fd02 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/BlueFoxTools/SpecialFunciton/BlueFoxRuckSackEngine.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/BlueFoxTools/SpecialFunciton/BlueFoxRuckSackEngine.py @@ -555,7 +555,10 @@ class RucksackScreen(baseScreen): :param destinationSlot: 目标物品槽位 :return: """ - itemDict1, itemDict2 = DeclareItemAnyNum(self.items[originSlot], 64 - self.items[destinationSlot]['count']) + itemInfo = GetItemBaseInfoSafely(self.items[originSlot]) + maxStack = (itemInfo or {}).get('maxStackSize') or 64 + itemDict1, itemDict2 = DeclareItemAnyNum( + self.items[originSlot], maxStack - self.items[destinationSlot]['count']) self.SetItemAbs(originSlot, itemDict1) return itemDict2 diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/BlueFoxTools/SpecialFunciton/BlueFoxSystem.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/BlueFoxTools/SpecialFunciton/BlueFoxSystem.py index 78871a9..ceb6a04 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/BlueFoxTools/SpecialFunciton/BlueFoxSystem.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/BlueFoxTools/SpecialFunciton/BlueFoxSystem.py @@ -773,7 +773,8 @@ class BlueFoxServerSystem(serverBaseSystem): # ============================================================================ # 统一"主动获得物品"接口(任务一): # 所有给玩家的物品一律按优先级分发, 而非直接掉落: - # 1) 背包(0~35格)存在同类且未堆满(64) -> 数量 +count 合并 + # 1) 背包(0~35格)存在同类且未堆满(按物品真实堆叠上限) -> 数量 +count 合并 + # (上限<=1 的物品如水桶/工具不合并, 由 2/3/4 步处理) # 2) 主手为空 -> 放到主手 # 3) 主手有物 -> 放入背包(同类叠加/空位) # 4) 背包满且主手有物 -> 掉落物形式(在 pos 上方生成) @@ -832,14 +833,31 @@ class BlueFoxServerSystem(serverBaseSystem): pass return False + def _getItemMaxStack(self, itemName, aux=0): + """取物品真实的堆叠上限。取不到时回退 64(与原行为一致, 保证未知物品仍可合并)。""" + try: + info = serverCompFactory.CreateItem(LevelId).GetItemBasicInfo( + itemName, aux, False) + size = (info or {}).get("maxStackSize") + if size: + return int(size) + except Exception: + pass + return 64 + def _mergeSameStackInv(self, playerId, itemName, count=1, aux=0): - """把 count 个 (itemName, aux) 合并进背包(0~35格)里已有的同类堆叠(未满64)。 + """把 count 个 (itemName, aux) 合并进背包(0~35格)里已有的同类堆叠(未满真实上限)。 返回"剩余没能合并的数量"(0 = 全部并进了已有堆叠)。 + 上限取物品真实 maxStackSize, 上限<=1 的物品(水桶/工具等)一律不合并, + 交由后续主手/背包(引擎接口)/掉落处理, 避免出现"一格被叠成多个"。 读写用本工程已验证可用的 GetPlayerAllItems(0) + SetInvItemNum (参考 FastComp.DeclarePlayerInvItem); 逐格独立 try 保护, 单格异常不影响其它格。""" remain = count if remain <= 0: return 0 + maxStack = self._getItemMaxStack(itemName, aux) + if maxStack <= 1: + return remain try: itemComp = serverCompFactory.CreateItem(playerId) allItems = itemComp.GetPlayerAllItems(0) # 0 = ItemPosType.INVENTORY(0~35) @@ -857,9 +875,9 @@ class BlueFoxServerSystem(serverBaseSystem): if (d.get("newAuxValue") or 0) != aux: continue cur = d.get("count") or 0 - if cur <= 0 or cur >= 64: + if cur <= 0 or cur >= maxStack: continue - add = min(64 - cur, remain) + add = min(maxStack - cur, remain) if itemComp.SetInvItemNum(index, cur + add): remain -= add except Exception: