| | |
| | | #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}
|
| | |
| | | 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
|
| | |
| | | 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:
|
| | |
| | | 武将等级>突破等级>武将星级>武将品质>武将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)
|
| | |
| | |
|
| | | 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: 是否拍品
|
| | | '''
|
| | |
| | | #不可放入
|
| | | 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):
|
| | |
| | |
|
| | | #常规物品
|
| | | 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)
|
| | |
| | | # @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)
|
| | |
| | | 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
|
| | |
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | | ## 执行物品放入背包逻辑
|
| | |
| | | # @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
|
| | |
| | | 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 主干取消拍品有效时长设定
|
| | |
| | | #---无空位置,替换---
|
| | | 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):
|