| | |
| | | import IpyGameDataPY
|
| | | import EventShell
|
| | |
|
| | | import math
|
| | | #---------------------------------------------------------------------
|
| | | ## 放不下主角背包放入万能背包的逻辑, curGiveItem 要先 SetCount
|
| | | # @param curPlayer 当前玩家
|
| | |
| | | def PutInItem(self, packIndex, tagItem, defaultPile=True, event=["", False, {}]):
|
| | | curPlayer = self.__Player
|
| | |
|
| | | if packIndex != ShareDefine.rptTreasure and self.DoTransformItem(curPlayer, tagItem):
|
| | | tagItem.Clear() # 需清除,不然会导致内存泄露 寻宝仓库可暂存直接转化数值的物品
|
| | | return True
|
| | | |
| | | isEquip = ItemCommon.CheckItemIsEquip(tagItem)
|
| | | if isEquip:
|
| | | defaultPile = False # 装备默认不判断堆叠
|
| | |
| | |
|
| | | packIndex = ChConfig.GetItemPackType(curItemData.GetType(), packIndex)
|
| | |
|
| | | if not self.CanPutInItem(packIndex, tagItem.GetItemTypeID(), tagItem.GetCount(), tagItem.GetIsBind(), defaultPile):
|
| | | GameWorld.DebugLog("背包满,不能放入物品 count = %d"%tagItem.GetCount())
|
| | | if not self.CanPutInItem(packIndex, tagItem.GetItemTypeID(), GetItemCount(tagItem), tagItem.GetIsBind(), defaultPile):
|
| | | GameWorld.DebugLog("背包满,不能放入物品 count = %d"%GetItemCount(tagItem))
|
| | | tagItem.Clear()
|
| | | return False
|
| | | |
| | | itemID = tagItem.GetItemTypeID()
|
| | | if itemID in ChConfig.Def_TransformItemIDList:
|
| | | # 直接转化为对应货币的物品仅在放入背包时直接转化,否则还是以真实物品的形式存在,但堆叠上限需要做特殊处理
|
| | | if packIndex == IPY_GameWorld.rptItem:
|
| | | self.DoTransformItem(curPlayer, tagItem)
|
| | | tagItem.Clear() # 需清除,不然会导致内存泄露
|
| | | return True
|
| | | defaultPile = True
|
| | | maxPackCount = ChConfig.Def_UpperLimit_DWord # 转化物品叠加上限不取物品表的, 暂定堆叠上限20亿
|
| | | else:
|
| | | maxPackCount = curItemData.GetPackCount()
|
| | |
|
| | | # 虚拟背包, 默认不做叠加
|
| | | if packIndex in ShareDefine.Def_VPack_TypeList:
|
| | |
| | | if item.GetIsLocked() == True:
|
| | | continue
|
| | |
|
| | | packItemCount = item.GetCount()
|
| | | curItemCount = tagItem.GetCount()
|
| | | canPutinCount = tagItem.GetPackCount() - packItemCount
|
| | | packItemCount = GetItemCount(item)
|
| | | curItemCount = GetItemCount(tagItem)
|
| | | canPutinCount = maxPackCount - packItemCount
|
| | | if canPutinCount <= 0:
|
| | | continue
|
| | | #可以摆放
|
| | |
| | | if item.IsEmpty() != True:
|
| | | continue
|
| | |
|
| | | packItemCount = item.GetCount() # Ϊ0
|
| | | curItemCount = tagItem.GetCount()
|
| | | canPutinCount = tagItem.GetPackCount() - packItemCount
|
| | | packItemCount = GetItemCount(item) # Ϊ0
|
| | | curItemCount = GetItemCount(tagItem)
|
| | | canPutinCount = maxPackCount - packItemCount
|
| | | if canPutinCount <= 0:
|
| | | continue
|
| | | #可以摆放
|
| | |
| | | putResult = True
|
| | |
|
| | | if isNeedRecord:
|
| | | itemNoteDict = ItemCommon.GetItemNoteDict(item, curItemCount, packItemCount, item.GetCount())
|
| | | itemNoteDict = ItemCommon.GetItemNoteDict(item, curItemCount, packItemCount, GetItemCount(item))
|
| | | ItemCommon.DR_GetItem(curPlayer, packIndex, eventName, itemNoteDict, addDict)
|
| | | break
|
| | |
|
| | |
| | | return False, 0
|
| | |
|
| | | if curItemID in ChConfig.Def_TransformItemIDList:
|
| | | #特殊物品无需判断数量
|
| | | # 货币直接转换的物品如果是放入背包的则直接转化,无需暂用格子
|
| | | if packIndex == IPY_GameWorld.rptItem:
|
| | | return True, 0
|
| | | |
| | | maxPackCount = ChConfig.Def_UpperLimit_DWord # 转化物品叠加上限不取物品表的, 暂定堆叠上限20亿
|
| | | else:
|
| | | maxPackCount = curItemData.GetPackCount()
|
| | |
|
| | | if maxPackCount == 0:
|
| | |
| | |
|
| | | itemIndex = -1
|
| | | curPack = self.__PlayerItemManager.GetPack(packIndex)
|
| | | for i in range(0, curPack.GetCount()):
|
| | | for i in xrange(curPack.GetCount()):
|
| | | item = curPack.GetAt(i)
|
| | |
|
| | | if item.IsEmpty():
|
| | |
| | | continue
|
| | |
|
| | | if (CanPackItemByItemType(item.GetItemTypeID(), item.GetIsBind(), curItemID, isBind) and
|
| | | maxPackCount > item.GetCount()):
|
| | | maxPackCount > GetItemCount(item)):
|
| | | #该物品锁定不执行==============================================
|
| | | #可堆叠
|
| | | maxCanPutItem += maxPackCount - item.GetCount()
|
| | | maxCanPutItem += maxPackCount - GetItemCount(item)
|
| | | if itemIndex == -1:
|
| | | itemIndex = i
|
| | |
|
| | |
| | | GameWorld.ErrLog(errorInfo + str(traceback.extract_stack()) + "\n" + traceback.format_exc())
|
| | | raise
|
| | |
|
| | | def GetItemCount(item):
|
| | | if item.GetItemTypeID() in ChConfig.Def_TransformItemIDList:
|
| | | return item.GetUserAttr(ShareDefine.Def_IudetItemCount)
|
| | | return item.GetCount()
|
| | |
|
| | | def GetItemNeedPackCount(packType, itemData, itemCount):
|
| | | if itemData.GetItemTypeID() in ChConfig.Def_TransformItemIDList:
|
| | | # 货币直接转换的物品如果是放入背包的则不需要暂用格子,放入其他的背包的则按物品叠加上限算
|
| | | if packType == IPY_GameWorld.rptItem:
|
| | | return 0
|
| | | packCount = ChConfig.Def_UpperLimit_DWord # 转化物品叠加上限不取物品表的
|
| | | else:
|
| | | packCount = itemData.GetPackCount()
|
| | | return int(math.ceil(itemCount / float(packCount)))
|
| | |
|
| | | ## 双手武器,需要两只手才拿得动
|
| | | # @param curEquip
|