ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -35,6 +35,7 @@
import IpyGameDataPY
import EventShell
import math
#---------------------------------------------------------------------
## 放不下主角背包放入万能背包的逻辑, curGiveItem 要先 SetCount
#  @param curPlayer 当前玩家
@@ -1087,10 +1088,6 @@
    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 # 装备默认不判断堆叠
@@ -1101,11 +1098,23 @@
        
        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)
@@ -1141,9 +1150,9 @@
                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    
                #可以摆放
@@ -1179,19 +1188,17 @@
            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
            #可以摆放
            if curItemCount > canPutinCount:
                #需要创建新物品放入
                curCreateItem = ItemCommon.CreateSingleItem(tagItem.GetItemTypeID())
                curCreateItem = GetOutPutItemObj(tagItem.GetItemTypeID(), canPutinCount, isBind)
                #注意: 不能在这里AssignItem, 否则会有2个物品指针指向同一个物品实例 . 巨大的错误在这一句 : curCreateItem.Assign(tagItem)
                SetItemCount(curCreateItem, canPutinCount)
                SetItemIsBind(curCreateItem, isBind)
                #此处不做装备拆解,如有需求外传for处理
                #如果是装备,那么 maxPackCount 为1 这里会循环自动创建新物品,所以直接 GetOutPutItemObj 即可, 暂不支持定制装备拆解
                
                item.AssignItem(curCreateItem)
                SetItemCount(tagItem, curItemCount - canPutinCount)
@@ -1213,7 +1220,7 @@
                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
                                                
@@ -1294,11 +1301,13 @@
            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
@@ -1322,7 +1331,7 @@
        
        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():
@@ -1336,10 +1345,10 @@
                        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
            
@@ -2208,7 +2217,21 @@
            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