ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -1095,6 +1095,15 @@
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_Honor, itemCount)
        return True
    
    def __CrossServerPutInItem(self, packIndex, tagItem, event=["", False, {}]):
        ## 跨服获得物品
        curPlayer = self.__Player
        serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer)
        itemData = [tagItem.GetItemTypeID(), tagItem.GetCount(), tagItem.GetIsBind(), tagItem.GetUserData()]
        itemMsg = {"PlayerID":curPlayer.GetPlayerID(), "ItemData":itemData, "PackIndex":packIndex, "Event":event}
        GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_PutInItem, itemMsg, [serverGroupID])
        return
    ## 放入物品 
    #  @param packIndex 背包索引
    #  @param tagItem 物品
@@ -1112,6 +1121,13 @@
        if not curItemData:
            return False
        
        if GameWorld.IsCrossServer():
            self.__CrossServerPutInItem(packIndex, tagItem, event)
            tagItem.Clear()
            return True
        if CheckChangeOldItem(curPlayer, tagItem):
            tagItem.Clear()
            return True
        packIndex = ChConfig.GetItemPackType(curItemData.GetType(), packIndex)
        
        if not self.CanPutInItem(packIndex, tagItem.GetItemTypeID(), GetItemCount(tagItem), tagItem.GetIsBind(), defaultPile):
@@ -1273,10 +1289,32 @@
        return
    
    def CheckRolePackEquipAttr(self):
        ''' 玩家上线修复装备属性bug
                    版本1:邮件给装备没有传奇属性,检查无传奇属性装备
                    版本2:绝版属性数值调整,已获得的装备重新刷下
        '''
        curPlayer = self.__Player
        checkVersion = 20190103
        key = "LoginCheckEquipAttr"
        if curPlayer.NomalDictGetProperty(key):
        curVersion = curPlayer.NomalDictGetProperty(key)
        if curVersion == checkVersion:
            return
        playerID = curPlayer.GetPlayerID()
        GameWorld.Log("玩家上线处理装备属性! curVersion=%s,checkVersion=%s" % (curVersion, checkVersion), playerID)
        outOfPrintAttrItemDict = {} # 有绝版属性的定制物品属性信息 {itemID:[绝版属性ID列表, 绝版属性数值列表], ...}
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for i in xrange(ipyDataMgr.GetAppointItemCount()):
            ipyData = ipyDataMgr.GetAppointItemByIndex(i)
            outOfPrintAttrList = ipyData.GetOutOfPrintAttr()
            outOfPrintAttrValueList = ipyData.GetOutOfPrintAttrValue()
            if not outOfPrintAttrList or len(outOfPrintAttrList) != len(outOfPrintAttrValueList):
                continue
            itemID = GetAppointItemRealID(ipyData.GetID())
            if not itemID:
                continue
            outOfPrintAttrItemDict[itemID] = [outOfPrintAttrList, outOfPrintAttrValueList]
        checkPackList = [IPY_GameWorld.rptEquip, IPY_GameWorld.rptItem, IPY_GameWorld.rptWarehouse]
        for packType in checkPackList:
            curPack = curPlayer.GetItemManager().GetPack(packType)
@@ -1288,8 +1326,21 @@
                isEquip = ItemCommon.CheckItemIsEquip(curItem)
                if not isEquip:
                    continue
                itemID = curItem.GetItemTypeID()
                self.CheckEquipAttr(packType, curItem)
        PlayerControl.NomalDictSetProperty(curPlayer, key, 1)
                # 重刷绝版属性
                if itemID in outOfPrintAttrItemDict:
                    outOfPrintAttrList, outOfPrintAttrValueList = outOfPrintAttrItemDict[itemID]
                    curItem.ClearUserAttr(ShareDefine.Def_IudetOutOfPrintAttrID)
                    curItem.ClearUserAttr(ShareDefine.Def_IudetOutOfPrintAttrValue)
                    for outOfPrintAttrIndex in xrange(len(outOfPrintAttrList)):
                        curItem.AddUserAttr(ShareDefine.Def_IudetOutOfPrintAttrID, outOfPrintAttrList[outOfPrintAttrIndex])
                        curItem.AddUserAttr(ShareDefine.Def_IudetOutOfPrintAttrValue, outOfPrintAttrValueList[outOfPrintAttrIndex])
                    GameWorld.Log("    玩家登录重刷装备绝版属性: packType=%s,i=%s,itemID=%s,outOfPrintAttrList=%s,outOfPrintAttrValueList=%s"
                                  % (packType, i, itemID, outOfPrintAttrList, outOfPrintAttrValueList), playerID)
        PlayerControl.NomalDictSetProperty(curPlayer, key, checkVersion)
        return
    ## 是否能放入物品 
@@ -1301,6 +1352,8 @@
    #  @return True or False
    #  @remarks 函数详细说明.
    def CanPutInItem(self, packIndex, curItemID, curItemCount, isBind, defaultPile=True):
        if GameWorld.IsCrossServer():
            return True
        checkRet, putIndex = self.CanPutInItemEx(packIndex, curItemID, curItemCount, isBind, defaultPile)
        return checkRet
    
@@ -2576,3 +2629,54 @@
    return
def CheckChangeOldItem(curPlayer, tagItem):
    ##替换旧物品
    itemID = tagItem.GetItemTypeID()
    changeOldItemDict = IpyGameDataPY.GetFuncEvalCfg('ChangeOldItem', 1, {})
    if itemID not in changeOldItemDict:
        return
    itemCnt = GetItemCount(tagItem)
    isBind = tagItem.GetIsBind()
    toItemID, toCnt, mailKey = changeOldItemDict[itemID]
    giveCnt = itemCnt * toCnt
    PlayerControl.SendMailByKey(mailKey, [curPlayer.GetPlayerID()], [[toItemID, giveCnt, isBind]])
    return True
def LoginCheckChangeOldItem(curPlayer):
    ##登录检查替换旧物品
    if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_VersionFix, ChConfig.Def_VerFix_GodWeaponItem):
        return
    GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_VersionFix, ChConfig.Def_VerFix_GodWeaponItem, 1)
    giveItemDict = {}
    mailDict = {}
    for packIndex in [IPY_GameWorld.rptItem, IPY_GameWorld.rptWarehouse, ShareDefine.rptTreasure]:
        curPack = curPlayer.GetItemManager().GetPack(packIndex)
        for i in xrange(curPack.GetCount()):
            curItem = curPack.GetAt(i)
            if not curItem:
                continue
            itemID = curItem.GetItemTypeID()
            changeOldItemDict = IpyGameDataPY.GetFuncEvalCfg('ChangeOldItem', 1, {})
            if itemID not in changeOldItemDict:
                continue
            isBind = curItem.GetIsBind()
            itemCount = curItem.GetCount()
            toItemID, toCnt, mailKey = changeOldItemDict[itemID]
            giveCnt = itemCount * toCnt
            keyStr = '%s_%s'%(toItemID, isBind)
            giveItemDict[keyStr] = giveItemDict.get(keyStr, 0) + giveCnt
            ItemCommon.DelItem(curPlayer, curItem, itemCount, False, "ChangeOldItem")
            if mailKey not in mailDict:
                mailDict[mailKey] = [keyStr]
            if keyStr not in mailDict[mailKey]:
                mailDict[mailKey].append(keyStr)
    for mailKey, keyStrList in mailDict.items():
        itemList = []
        for keyStr in keyStrList:
            if keyStr not in giveItemDict:
                continue
            giveCnt = giveItemDict[keyStr]
            itemID, isBind = keyStr.split('_')
            itemList.append([int(itemID), giveCnt, int(isBind)])
        PlayerControl.SendMailByKey(mailKey, [curPlayer.GetID()], itemList)
    return