ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -879,8 +879,6 @@
        #itemColor = curItem.GetItemColor()
        result = self.SwitchEquip(curItem, equipPackIndex)
        if result:
            #穿戴某阶某品质的装备成就
            PlayerSuccess.DoEquipSuccessLogic(curPlayer, classLV)
            #换装宝石处理
            Operate_EquipStone.DoMoveEquipStone(curPlayer, equipPackIndex)
            dataDict = {'dotype':'EquipItem', 'desItemID':desItemID, 'desUserData':desUserData,'srcItemID':srcItemID,'srcUserData':srcUserData}
@@ -1071,7 +1069,7 @@
    def DoTransformItem(self, curPlayer, tagItem, event=["", False, {}]):
        ## 将特殊物品转化为对应数值
        itemID = tagItem.GetItemTypeID()
        itemCount = max(tagItem.GetUserAttr(ShareDefine.Def_IudetItemCount), tagItem.GetCount())
        itemCount = tagItem.GetCount()
        eventName, isForceEvent, addDict = event
        if isForceEvent:
            pass
@@ -1661,11 +1659,11 @@
    if endIndex == 0:
        endIndex = curPack.GetCount() - 1
    #检查是否能整理
    for i in range(0, curPack.GetCount()):
        curItem = curPack.GetAt(i)
        if curItem.GetIsLocked():
            #GameWorld.Log("物品有锁, 不允许重整")
            return
    #for i in range(0, curPack.GetCount()):
    #    curItem = curPack.GetAt(i)
    #    if curItem.GetIsLocked():
    #        #GameWorld.Log("物品有锁, 不允许重整")
    #        return
    
    # 整理方式不同区分
    if packIndex == ShareDefine.rptHero:
@@ -2003,8 +2001,23 @@
    武将等级>突破等级>武将星级>武将品质>武将ID
    '''
    
    posNum1 = item1.GetUserAttr(ShareDefine.Def_IudetHeroPosNum)
    posNum2 = item2.GetUserAttr(ShareDefine.Def_IudetHeroPosNum)
    posNum1, posNum2 = 0, 0
    for lpIndex in range(item1.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)):
        lineupValue = item1.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
        lineupID = lineupValue / 10000
        if lineupID != ShareDefine.Lineup_Main:
            continue
        posNum1 = lineupValue % 100
        break
    for lpIndex in range(item2.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)):
        lineupValue = item2.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
        lineupID = lineupValue / 10000
        if lineupID != ShareDefine.Lineup_Main:
            continue
        posNum2 = lineupValue % 100
        break
    if (posNum1 and posNum2) or (not posNum1 and not posNum2):
        lv1 = item1.GetUserAttr(ShareDefine.Def_IudetHeroLV)
        lv2 = item2.GetUserAttr(ShareDefine.Def_IudetHeroLV)
@@ -2251,7 +2264,41 @@
        
    return
def GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, packIndexList=None, event=["", False, {}]):
def CheckGiveBindMoneyTypeItem(curPlayer, checkMoneyType=None):
    ## 检查给绑定货币的展示物品
    bindMoneyItemInfo = IpyGameDataPY.GetFuncEvalCfg("PutInItemPack", 2, {})
    needMoneyItemDict = {}
    for itemIDStr, moneyType in bindMoneyItemInfo.items():
        if checkMoneyType != None and moneyType != checkMoneyType:
            continue
        if PlayerControl.GetMoney(curPlayer, moneyType): # 有货币时才需要
            needMoneyItemDict[int(itemIDStr)] = moneyType
    if not needMoneyItemDict:
        #GameWorld.DebugLog("绑定货币显示物品已经都有了")
        return
    curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    for i in xrange(curPack.GetCount()):
        curItem = curPack.GetAt(i)
        if not curItem or curItem.IsEmpty():
            continue
        itemID = curItem.GetItemTypeID()
        if itemID in needMoneyItemDict:
            needMoneyItemDict.pop(itemID)
            if not needMoneyItemDict:
                break
    # 还有没给的物品补给,后端只负责给物品,不处理个数,前端对该类物品默认绑定货币对应的值来显示个数
    for itemID, moneyType in needMoneyItemDict.items():
        if not GivePlayerItem(curPlayer, itemID, 1, False, [IPY_GameWorld.rptItem]):
            break
        GameWorld.DebugLog("给绑定货币显示物品: moneyType=%s,itemID=%s" % (moneyType, itemID))
    return
def GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, packIndexList=None, event=["", False, {}], setAttrDict=None):
    '''给玩家物品
    @param isAuctionItem: 是否拍品
    '''
@@ -2286,19 +2333,11 @@
        #不可放入
        return False
    
    #定制物品
    if GetAppointItemRealID(itemID):
        isOK = False
        for _ in xrange(itemCount):
            if GivePlayerAppointItem(curPlayer, itemID, isAuctionItem, event):
                isOK = True # 只要有成功的就返回成功,防止异常情况失败可能导致被刷
        return isOK
    #装备
    if ItemCommon.GetIsEquip(curItemData):
        isOK = False
        for _ in xrange(itemCount):
            outPutEquip = GetOutPutItemObj(itemID, 1, isAuctionItem, curPlayer=curPlayer)
            outPutEquip = GetOutPutItemObj(itemID, 1, isAuctionItem, curPlayer=curPlayer, setAttrDict=setAttrDict)
            if not outPutEquip:
                return isOK
            if DoLogic_PutItemInPack(curPlayer, outPutEquip, event, packIndexList):
@@ -2307,10 +2346,10 @@
    
    #常规物品
    isOK = False
    for _ in range(itemCount/65535 + 1):
    for _ in range(itemCount/ChConfig.Def_ItemCount_Max + 1):
        if itemCount <= 0:
            break
        giveItem = GetOutPutItemObj(itemID, itemCount, isAuctionItem, curPlayer=curPlayer)
        giveItem = GetOutPutItemObj(itemID, itemCount, isAuctionItem, curPlayer=curPlayer, setAttrDict=setAttrDict)
        if not giveItem:
            return isOK
        giveCount = GetItemCount(giveItem)
@@ -2326,7 +2365,7 @@
    # @return: 给成功总数,0代表给失败了
    
    giveOKCount = 0
    for _ in range(itemCount/65535 + 1):
    for _ in range(itemCount/ChConfig.Def_ItemCount_Max + 1):
        if giveOKCount >= itemCount:
            break
        giveItem = GetOutPutItemObj(itemID, itemCount - giveOKCount, isAuctionItem, curPlayer=curPlayer)
@@ -2343,110 +2382,6 @@
            giveOKCount += curCount
            
    return giveOKCount
def GivePlayerAppointItem(curPlayer, appointID, isAuctionItem, event=["", False, {}]):
    '''给玩家定制物品表物品,定制物品默认个数1
    @param appointID 定制表ID
    @param isAuctionItem 是否拍品
    '''
    itemDictData = GetAppointItemDictData(appointID, isAuctionItem)
    if not itemDictData:
        return False
    return GivePlayerEquip(curPlayer, itemDictData, event=event)
def GetAppointItemDictData(appointID, isAuctionItem):
    '''获取定制表物品数据,定制物品默认个数1
    @param appointID 定制表ID
    @param isAuctionItem 是否拍品
    '''
    itemID = GetAppointItemRealID(appointID)
    if not itemID:
        return {}
    ipyData = IpyGameDataPY.GetIpyGameData("AppointItem", appointID)
    if not ipyData:
        return {}
    itemDictData = {}
    itemDictData['legendAttrID'] = ipyData.GetLegendAttrID()
    itemDictData['legendAttrValue'] = ipyData.GetLegendAttrValue()
    itemDictData['ItemID'] = itemID
    itemDictData['CancelUseLimit'] = ipyData.GetCancelUseLimit()
    itemDictData['IsAuctionItem'] = isAuctionItem
    return itemDictData
def GetAppointItemRealID(itemID):
    '''获取定制物品对应的真实物品ID'''
    curItem = GameWorld.GetGameData().GetItemByTypeID(itemID)
    if not curItem:
        return 0
    curEff = curItem.GetEffectByIndex(0)
    curEffID = curEff.GetEffectID()
    if curEffID != ChConfig.Def_Effect_AppointItem:
        return 0
    return curEff.GetEffectValue(0)
## 根据物品data字典给玩家装备/翅膀
#  @param curPlayer:玩家实例
#  @param itemData:物品数据
#  @param packType:背包类型
#  @param defaultPile 默认先判断是否能进行物品堆叠
#  @return None
def GivePlayerEquip(curPlayer, itemData, event=["", False, {}], packType=[IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere],
                    defaultPile=True):
    equipItem = GetItemByData(itemData)
    #将物品放入背包
    return DoLogic_PutItemInPack(curPlayer, equipItem, event, packType, defaultPile)
## 根据物品data字典创建物品
#  @param itemData:物品数据
#  @return ItemObj
def GetItemByData(itemData):
    if not itemData:
        return
    itemID = int(itemData.get('ItemID', 0))
    isAuctionItem = int(itemData.get('IsAuctionItem', 0))
    equipItem = ItemCommon.CreateSingleItem(itemID, isAuctionItem=isAuctionItem)
    if not equipItem:
        return
    tmpEquipData = SingleEquipTmpData()
    #tmpEquipData.starLV = int(itemData.get('StarLV', '0'))
    #tmpEquipData.holeCnt = int(itemData.get('HoleCount', '0'))
    #tmpEquipData.stoneData = eval(itemData.get('StoneData', '[]'))
    tmpEquipData.isBind = isAuctionItem
    #tmpEquipData.isSuite = int(itemData.get('IsSuit', '0'))
    #tmpEquipData.suiteLV = int(itemData.get('SuiteLV', '0'))
    #if tmpEquipData.suiteLV:
    #    tmpEquipData.isSuite = 1
    tmpEquipData.source = int(itemData.get('Source', str(ShareDefine.Item_Source_Unkown)))
    tmpEquipData.legendAttrIDList = itemData.get('legendAttrID', [])
    tmpEquipData.legendAttrValueList = itemData.get('legendAttrValue', [])
    # 装备附加属性
    ChItem.EquipAddAdditionEx(equipItem, tmpEquipData)
    if "UserData" in itemData:
        userData = itemData["UserData"]
        ItemCommon.SetItemUserData(equipItem, userData)
    if "EquipGS" in itemData:
        equipGS = int(itemData["EquipGS"])
        ItemCommon.SetEquipGearScore(equipItem, equipGS)
    # 取消等级限制
    if itemData.get('CancelUseLimit', 0):
        equipItem.SetUserAttr(ShareDefine.Def_IudetCancelUseLimit, 1)
    return equipItem
#---------------------------------------------------------------------
## 执行物品放入背包逻辑
@@ -2543,10 +2478,7 @@
#  @return None
def SetItemCount(item, cnt, playerID=0, accID=0, playerName=""):
    if not item.IsEmpty():
        if cnt > 0 and IsPutinAutoTransformItem(item):
            item.SetUserAttr(ShareDefine.Def_IudetItemCount, min(cnt, ChConfig.Def_UpperLimit_DWord))
        else:
            item.SetCount(min(cnt, 65535))
        item.SetCount(min(cnt, ChConfig.Def_ItemCount_Max))
    else:
        try:
            1 / 0
@@ -2555,10 +2487,7 @@
            GameWorld.ErrLog(errorInfo + str(traceback.extract_stack()) + "\n" + traceback.format_exc())
            raise
        
def GetItemCount(item):
    if IsPutinAutoTransformItem(item):
        return item.GetUserAttr(ShareDefine.Def_IudetItemCount)
    return item.GetCount()
def GetItemCount(item): return item.GetCount()
def GetItemNeedPackCount(packType, itemData, itemCount, isAuctionItem=0):
    # 20201223 主干取消拍品有效时长设定
@@ -2628,52 +2557,17 @@
    #---无空位置,替换---
    return placeList[0]
def GetOutPutItemObj(itemID, itemCount=1, isAuctionItem=False, expireTime=0, curPlayer=None, isAllAttr=False):
def GetOutPutItemObj(itemID, itemCount=1, isAuctionItem=False, expireTime=0, curPlayer=None, setAttrDict=None):
    ''' 获取功能产出的物品实例
    @param isAuctionItem: 是否拍品,默认非拍品
    @param expireTime: 有效时间,时间单位由时效类型决定
    @param curPlayer: 产出该物品时的玩家,物品某些属性由玩家等级决定,如传奇属性
    @param isAllAttr: 是否生成该装备所有属性,GM创建物品时用,需验证相关权限
    @param setAttrDict: 直接设置物品的属性 {key:value, ...} key支持  ShareDefine.Def_IudetXXX字符串 或 自定key
    '''
    curItem = ItemCommon.CreateSingleItem(itemID, itemCount, isAuctionItem, expireTime)
    curItem = ItemCommon.CreateSingleItem(itemID, itemCount, isAuctionItem, expireTime, curPlayer, setAttrDict)
    if not curItem:
        GameWorld.ErrLog("产出物品异常,无法创建物品 = %s" % (itemID))
        return
    # 英雄
    if curItem.GetType() == ChConfig.Def_ItemType_Hero:
        return curItem
    # 非装备,无需设置属性
    if not ItemCommon.CheckItemIsEquip(curItem):
        return curItem
    # 定制物品
    if GetAppointItemRealID(itemID):
        curItem.Clear()
        #GameWorld.DebugLog("清除给定制物品之前已经创建的物品ID=%s" % itemID)
        return GetItemByData(GetAppointItemDictData(itemID, isAuctionItem))
#    # 拍品不处理其他属性
#    if isAuctionItem:
#        return curItem
    tmpEquipData = SingleEquipTmpData()
    # 传奇属性
    legendAttrInfo = GetAddEquipLegendAttr(curItem, curPlayer, isAllAttr)
    if legendAttrInfo:
        tmpEquipData.legendAttrIDList = legendAttrInfo[0]
        tmpEquipData.legendAttrValueList = legendAttrInfo[1]
        tmpEquipData.legendAttrIDListShen = legendAttrInfo[2]
        tmpEquipData.legendAttrValueListShen = legendAttrInfo[3]
        tmpEquipData.legendAttrIDListXian = legendAttrInfo[4]
        tmpEquipData.legendAttrValueListXian = legendAttrInfo[5]
        tmpEquipData.legendAttrIDListJi = legendAttrInfo[6]
        tmpEquipData.legendAttrValueListJi = legendAttrInfo[7]
    # 其他装备属性
    ChItem.EquipAddAdditionEx(curItem, tmpEquipData)
    return curItem
def GetAddEquipLegendAttr(curItem, curPlayer, isAllAttr=False):