|  |  |  | 
|---|
|  |  |  | 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: | 
|---|
|  |  |  | return self.PutItemInVPack(packIndex, tagItem, event) | 
|---|
|  |  |  | 
|---|
|  |  |  | 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: | 
|---|
|  |  |  | #特殊物品无需判断数量 | 
|---|
|  |  |  | return True, 0 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | maxPackCount = curItemData.GetPackCount() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 货币直接转换的物品如果是放入背包的则直接转化,无需暂用格子 | 
|---|
|  |  |  | if packIndex == IPY_GameWorld.rptItem: | 
|---|
|  |  |  | return True, 0 | 
|---|
|  |  |  | maxPackCount = ChConfig.Def_UpperLimit_DWord # 转化物品叠加上限不取物品表的, 暂定堆叠上限20亿 | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | maxPackCount = curItemData.GetPackCount() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if maxPackCount == 0: | 
|---|
|  |  |  | GameWorld.Log("策划填表错误 %s -> maxPackCount = %s" % (curItemID , maxPackCount)) | 
|---|
|  |  |  | return False, 0 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 特殊处理不同的物品放入不同的背包,如神兽背包 | 
|---|
|  |  |  | packIndex = ChConfig.GetItemPackType(curItemData.GetType(), packIndex) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | maxCanPutItem = 0 | 
|---|
|  |  |  | curPlayer = self.__Player | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | errorInfo = "%s %s %s -- ItemControler->SetItemCount::" % (playerID, accID, playerName) | 
|---|
|  |  |  | 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 | 
|---|