水桶这种上限为一的 合并同类项时拿不到bug 解决

This commit is contained in:
wenhe committed 2026-09-30 15:32:23 +08:00
1 parent 97520502b7
commit 8e24c02cb3
2 files changed
+26 -5

No files matched your search

@@ -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
@@ -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: