hch
2019-01-24 ebf687f88a19562f9686a2dc80940807de8aa14c
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
@@ -29,7 +29,6 @@
import DataRecordPack
import EventReport
import ChItem
import PlayerMergeEvent
import IpyGameDataPY
import Operate_EquipStone
import PlayerViewCacheTube
@@ -340,7 +339,7 @@
#  @param itemID 物品ID
#  @return curSingleItem
#  @remarks 函数详细说明.
def CreateSingleItem(itemID, itemCount=1, isBind=0):
def CreateSingleItem(itemID, itemCount=1, isBind=0, expireTime=0):
    curSingleItem = GameWorld.GetItemFactory().CreateItem(itemID)
    if not curSingleItem:
        return
@@ -378,6 +377,9 @@
        
    ItemControler.SetItemCount(curSingleItem, itemCount)
    
    if expireTime > 0:
        curSingleItem.SetUserAttr(ShareDefine.Def_IudetExpireTime, expireTime)
    #这里返回的是SingleItem , 如果创建了,未使用,会找出C++内存泄露!!!
    return curSingleItem
@@ -392,7 +394,9 @@
    return
def CalcEquipGS(curItem):
    ##计算装备评分
    '''计算装备评分
        评分组成:装备基础 + 传奇属性 + 绝版属性
    '''
    if not CheckNoteEquipGS(curItem):
        #GameWorld.DebugLog("不设置装备评分")
        return 0
@@ -408,25 +412,27 @@
            break
        attrDict[effectID] = attrDict.get(effectID, 0) + curEffect.GetEffectValue(0)
        
    gsParamIpyData = None
    classLV = GetItemClassLV(curItem)
    color = curItem.GetItemColor()
    itemQuality = curItem.GetItemQuality()
    gsParamIpyData = IpyGameDataPY.GetIpyGameData("EquipGSParam", classLV, color, itemQuality)
    # 传奇属性
    legendAttrIDCnt = curItem.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrID)
    legendAttrValueCnt = curItem.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrValue)
    if legendAttrIDCnt and legendAttrIDCnt == legendAttrValueCnt:
        classLV = GetItemClassLV(curItem)
        color = curItem.GetItemColor()
        itemQuality = curItem.GetItemQuality()
        gsParamIpyData = IpyGameDataPY.GetIpyGameData("EquipGSParam", classLV, color, itemQuality)
        for i in xrange(legendAttrIDCnt):
            attrID = curItem.GetUserAttrByIndex(ShareDefine.Def_IudetLegendAttrID, i)
            attrValue = curItem.GetUserAttrByIndex(ShareDefine.Def_IudetLegendAttrValue, i)
            attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
            
    MinAtk = attrDict.get(ShareDefine.Def_Effect_MinAtk, 0)
    MaxAtk = attrDict.get(ShareDefine.Def_Effect_MaxAtk, 0)
    Atk = attrDict.get(ShareDefine.Def_Effect_Atk, 0)
    MinAtk = attrDict.get(ShareDefine.Def_Effect_MinAtk, 0) + Atk
    MaxAtk = attrDict.get(ShareDefine.Def_Effect_MaxAtk, 0) + Atk
    MaxHP = attrDict.get(ShareDefine.Def_Effect_MaxHP, 0)
    Def = attrDict.get(ShareDefine.Def_Effect_Def, 0)
    ArmorDefPer = attrDict.get(ShareDefine.Def_Effect_ArmorDefAddPer, 0)
    IceAtk = attrDict.get(ShareDefine.Def_Effect_IceAtk, 0)
    IceDef = attrDict.get(ShareDefine.Def_Effect_IceDef, 0)
    
    AtkPer = attrDict.get(ShareDefine.Def_Effect_AddAtkByPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetAtkPerC())
    DamagePer = attrDict.get(ShareDefine.Def_Effect_DamagePer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDamagePerC())
@@ -449,7 +455,23 @@
    SuperHitReduce = attrDict.get(ShareDefine.Def_Effect_SuperHitReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSuperHitReduceC())
    SkillAtkRate = attrDict.get(ShareDefine.Def_Effect_SkillAtkRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAtkRateC())
    SpeedPer = attrDict.get(ShareDefine.Def_Effect_SpeedPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSpeedPerC())
    SkillAtkRateReduceC = attrDict.get(ShareDefine.Def_Effect_SkillAtkRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAtkRateReduceC())
    SkillAtkRateReduce = attrDict.get(ShareDefine.Def_Effect_SkillAtkRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAtkRateReduceC())
    Hit = attrDict.get(ShareDefine.Def_Effect_Hit, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetHitC())
    Miss = attrDict.get(ShareDefine.Def_Effect_Miss, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetMissC())
    SkillAddPer1 = attrDict.get(ShareDefine.Def_Effect_SkillAddPer1, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer1C())
    SkillAddPer2 = attrDict.get(ShareDefine.Def_Effect_SkillAddPer2, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer2C())
    SkillAddPer3 = attrDict.get(ShareDefine.Def_Effect_SkillAddPer3, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer3C())
    SkillAddPer4 = attrDict.get(ShareDefine.Def_Effect_SkillAddPer4, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer4C())
    SkillAddPer5 = attrDict.get(ShareDefine.Def_Effect_SkillAddPer5, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer5C())
    SkillAddPer6 = attrDict.get(ShareDefine.Def_Effect_SkillAddPer6, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer6C())
    SkillAddPer7 = attrDict.get(ShareDefine.Def_Effect_SkillAddPer7, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer7C())
    SkillReducePer1 = attrDict.get(ShareDefine.Def_Effect_SkillReducePer1, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer1C())
    SkillReducePer2 = attrDict.get(ShareDefine.Def_Effect_SkillReducePer2, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer2C())
    SkillReducePer3 = attrDict.get(ShareDefine.Def_Effect_SkillReducePer3, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer3C())
    SkillReducePer4 = attrDict.get(ShareDefine.Def_Effect_SkillReducePer4, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer4C())
    SkillReducePer5 = attrDict.get(ShareDefine.Def_Effect_SkillReducePer5, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer5C())
    SkillReducePer6 = attrDict.get(ShareDefine.Def_Effect_SkillReducePer6, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer6C())
    SkillReducePer7 = attrDict.get(ShareDefine.Def_Effect_SkillReducePer7, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer7C())
    
    # 攻速不默认乘,仅作为参数提供策划使用
    AtkSpeed = attrDict.get(ShareDefine.Def_Effect_AtkSpeed, 0)
@@ -470,9 +492,22 @@
    if GetIsDogzEquip(curItem):
        # 神兽装备用不同公式
        value = eval(FormulaControl.GetCompileFormula("EquipGSFormula3", IpyGameDataPY.GetFuncCfg("EquipGSFormula", 3)))
    elif GetIsZhuXianEquip(curItem):
        value = eval(FormulaControl.GetCompileFormula("EquipGSFormula4", IpyGameDataPY.GetFuncCfg("EquipGSFormula", 4)))
    else:
        value = eval(FormulaControl.GetCompileFormula("EquipGSFormula", IpyGameDataPY.GetFuncCfg("EquipGSFormula")))
    return value
def GetZhuXianEquipTotalGS(curPlayer):
    ##诛仙装备总评分
    equipScoreTotal = 0
    zhuXianEquipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptZhuXianEquip)
    for equipIndex in xrange(zhuXianEquipPack.GetCount()):
        curEquip = zhuXianEquipPack.GetAt(equipIndex)
        if curEquip.IsEmpty():
            continue
        equipScoreTotal += GetEquipGearScore(curEquip)
    return equipScoreTotal
#---------------------------------------------------------------------
## 通过效果ID,检查是否为指定物品 
@@ -875,24 +910,56 @@
# 特殊判定根据时效时间判定物品是否可以使用
# 过期物品不能使用或装备但是可以出售续费
def CheckItemCanUseByExpireTime(curItem):
    curItemCreateTime = curItem.GetCreateTime()
    curItemExpireTime = curItem.GetExpireTime()
    curItemPastTime = GameWorld.GetPastSeconds(curItemCreateTime)
#    curItemCreateTime = curItem.GetCreateTime()
#    curItemExpireTime = curItem.GetExpireTime()
#    curItemPastTime = GameWorld.GetPastSeconds(curItemCreateTime)
#
#    reduceType = curItem.GetEndureReduceType()
#    if reduceType == ChConfig.Def_EquipReduceType_RTimeItem and \
#    curItemPastTime >= curItemExpireTime:
#        # 过期了
#        return False
#
#    if reduceType == ChConfig.Def_EquipReduceType_Time:
#        # 开始装备时间
#        startTime = curItem.GetUserAttr(ShareDefine.Def_IudetCreateTime)
#        if startTime == 0:
#            return True
#        if time.time() - startTime > curItemExpireTime:
#            return False
    
    isExpireItem, expireTime = GetItemRemainingTime(curItem)
    if isExpireItem:
        if expireTime <= 0:
            return False
    return True
def GetItemRemainingTime(curItem):
    ''' 获取物品剩余时间,秒
    @return: 是否时效物品, 剩余时间
    '''
    isExpireItem = False
    reduceType = curItem.GetEndureReduceType()
    if reduceType == ChConfig.Def_EquipReduceType_RTimeItem and \
    curItemPastTime >= curItemExpireTime:
        # 过期了
        return False
    remainingTime = 0
    
    if reduceType == ChConfig.Def_EquipReduceType_Time:
    if reduceType in [ChConfig.Def_EquipReduceType_Time, ChConfig.Def_EquipReduceType_RTimeItem]:
        isExpireItem = True
        # 装备后开始计时
        curItemExpireTime = curItem.GetUserAttr(ShareDefine.Def_IudetExpireTime)
        if not curItemExpireTime:
            curItemExpireTime = curItem.GetExpireTime()
        # 开始装备时间
        startTime = curItem.GetUserAttr(ShareDefine.Def_IudetCreateTime)
        if startTime == 0:
            return True
        if time.time() - startTime > curItemExpireTime:
            return False
    return True
            remainingTime = curItemExpireTime
        else:
            curItemPastTime = max(0, int(time.time()) - startTime)
            remainingTime = max(0, curItemExpireTime - curItemPastTime)
        return isExpireItem, remainingTime
    return isExpireItem, remainingTime
##检查该物品是否合法,类型验证
# @param curItem 物品实例
@@ -1331,8 +1398,9 @@
    return hasEnough, itemIndexList, findItemIsBind, needCnt
def GetPackItemBindStateIndexInfo(curPlayer, itemID):
def GetPackItemBindStateIndexInfo(curPlayer, itemID, needCount=0):
    ''' 获取背包消耗道具绑定及未绑定索引情况
    @param needCount: 所需个数, 默认绑定优先,当找到已经足够的个数后不再遍历,减少无用遍历
    @return: 可消耗物品列表[[绑定物品索引], [不绑定物品索引]], 绑定个数, 未绑定个数
    '''
    consumeItemIndexList = [[], []] # 可消耗物品列表[[绑定物品索引], [不绑定物品索引]]
@@ -1353,6 +1421,8 @@
        if curItem.GetIsBind():
            consumeItemIndexList[0].append(i)
            bindCnt += itemCount
            if needCount > 0 and bindCnt >= needCount:
                break
        else:
            consumeItemIndexList[1].append(i)
            unBindCnt += itemCount
@@ -1414,11 +1484,6 @@
    #系统提示 LostRes 失去物品
    #if needSysmsg:
    #    PlayerControl.NotifyCode(curPlayer, 'LostRes', [itemTypeID, totalUseCnt])
    #添加跨服服务器中使用物品事件
    if itemTypeID in ReadChConfig.GetEvalChConfig("MergeServerCanUseItemID"):
        eventInfo = [itemTypeID, totalUseCnt, makeItemBind, eventName, saveDataDict]
        PlayerMergeEvent.AddMSPlayerEvent(curPlayer.GetPlayerID(), PlayerMergeEvent.Def_MSPEvent_DelItem, eventInfo)
    return makeItemBind
def GetCostItemIndexList(costItemInfo, itemPack, bindFirst=True):
@@ -1507,7 +1572,18 @@
def GetShopItemPrice(itemID, priceType):
    ''' 获取商城物品对应价格 '''
    ipyData = IpyGameDataPY.GetIpyGameDataByCondition("Store", {"ItemID":itemID, "MoneyType":priceType}, isLogNone=False)
    # 系统固定商店类型: 仙玉(2-常用道具,3-成长变强),绑玉(4-绑玉商城)
    priceTypeShopTypeDict = {IPY_GameWorld.TYPE_Price_Gold_Money:[2, 3],
                             IPY_GameWorld.TYPE_Price_Gold_Paper:[4],
                             }
    ipyData = None
    if priceType in priceTypeShopTypeDict:
        for shopType in priceTypeShopTypeDict[priceType]:
            ipyData = IpyGameDataPY.GetIpyGameDataByCondition("Store", {"ShopType":shopType, "ItemID":itemID, "MoneyType":priceType}, isLogNone=False)
            if ipyData:
                break
    else:
        ipyData = IpyGameDataPY.GetIpyGameDataByCondition("Store", {"ItemID":itemID, "MoneyType":priceType}, isLogNone=False)
    if not ipyData:
        return 0
    return ipyData.GetMoneyNum()
@@ -1638,11 +1714,11 @@
#  @remarks 函数详细说明.
def SwitchItem(curPlayer, curItem, switchItem, putInPackIndex):
    ##物品绑定字段判定 -> 装备绑定
    if putInPackIndex == IPY_GameWorld.rptEquip:
    if putInPackIndex in [IPY_GameWorld.rptEquip, ShareDefine.rptZhuXianEquip]:
        DoLogic_ItemBindType(curPlayer, switchItem, ChConfig.Def_BindType_DoEquipBind)
        
    # 装备技能书、坐骑装备绑定
    if putInPackIndex in [IPY_GameWorld.rptHorseEquip]:
    if putInPackIndex in [IPY_GameWorld.rptHorseEquip, ShareDefine.rptZhuXianEquip]:
        DoLogic_ItemBindType(curPlayer, curItem, ChConfig.Def_BindType_DoEquipBind)
    
    #交换装备
@@ -1663,11 +1739,11 @@
        return
    
    ##物品绑定字段判定 -> 装备绑定
    if putInPackIndex == IPY_GameWorld.rptEquip:
    if putInPackIndex in [IPY_GameWorld.rptEquip, ShareDefine.rptZhuXianEquip]:
        DoLogic_ItemBindType(curPlayer, switchItem, ChConfig.Def_BindType_DoEquipBind)
    
    # 装备技能书、坐骑装备绑定
    if putInPackIndex in [IPY_GameWorld.rptHorseEquip]:
    if putInPackIndex in [IPY_GameWorld.rptHorseEquip, ShareDefine.rptZhuXianEquip]:
        DoLogic_ItemBindType(curPlayer, emptyItem, ChConfig.Def_BindType_DoEquipBind)
    if switchItem.GetGameWorldItemType() == IPY_GameWorld.gwitRoleItem:
@@ -1689,6 +1765,10 @@
def GetIsDogzEquip(curItem):
    ## 返回是否神兽装备
    return curItem.GetType() in ChConfig.Def_DogzEquiipType
def GetIsZhuXianEquip(curItem):
    ## 返回是否诛仙装备
    return curItem.GetType() in ChConfig.Def_ZhuXianEquiipType
## 返回是否武器
#  @param curItem 当前物品
@@ -1803,11 +1883,6 @@
    ItemControler.SetItemCount(curItem, curItemCnt - delCnt,
                               curPlayer.GetPlayerID(), curPlayer.GetAccID(),
                               curPlayer.GetPlayerName())
    #添加跨服服务器中使用物品事件
    if curItemTypeID in ReadChConfig.GetEvalChConfig("MergeServerCanUseItemID"):
        eventInfo = [curItemTypeID, delCnt, curItemBind, recordName, saveDataDict]
        PlayerMergeEvent.AddMSPlayerEvent(curPlayer.GetPlayerID(), PlayerMergeEvent.Def_MSPEvent_DelItem, eventInfo)
    return
def DelVPackItem(curPlayer, packIndex, placeList, eventName=""):
@@ -1829,6 +1904,13 @@
            itemName = str(itemID) if not curItemData else  curItemData.GetName()
            itemName = "%s LV%s" % (itemName, plusLV + 1)
            isNeedRecord = curItemData and ItemControler.IsRuneItemNeedRecord(curItemData, plusLV)
        if packIndex == ShareDefine.rptGatherSoul:
            itemID = ItemControler.GetGatherSoulItemID(itemKeyData)
            plusLV = ItemControler.GetGatherSoulItemPlusLV(itemKeyData)
            curItemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
            itemName = str(itemID) if not curItemData else  curItemData.GetName()
            itemName = "%s LV%s" % (itemName, plusLV + 1)
            isNeedRecord = curItemData and ItemControler.IsGatherSoulItemNeedRecord(curItemData, plusLV)
            
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_VPackItem % (packIndex, place), 0)
        if isNeedRecord: