| | |
| | | import DataRecordPack
|
| | | import EventReport
|
| | | import ChItem
|
| | | import PlayerMergeEvent
|
| | | import IpyGameDataPY
|
| | | import Operate_EquipStone
|
| | | import PlayerViewCacheTube
|
| | |
| | | # @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
|
| | |
| | |
|
| | | ItemControler.SetItemCount(curSingleItem, itemCount)
|
| | |
|
| | | if expireTime > 0:
|
| | | curSingleItem.SetUserAttr(ShareDefine.Def_IudetExpireTime, expireTime)
|
| | | |
| | | #这里返回的是SingleItem , 如果创建了,未使用,会找出C++内存泄露!!!
|
| | | return curSingleItem
|
| | |
|
| | |
| | | return
|
| | |
|
| | | def CalcEquipGS(curItem):
|
| | | ##计算装备评分
|
| | | '''计算装备评分
|
| | | 评分组成:装备基础 + 传奇属性 + 绝版属性
|
| | | '''
|
| | | if not CheckNoteEquipGS(curItem):
|
| | | #GameWorld.DebugLog("不设置装备评分")
|
| | | return 0
|
| | |
| | | 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())
|
| | |
| | | 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())
|
| | | 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())
|
| | |
|
| | | # 攻速不默认乘,仅作为参数提供策划使用
|
| | | AtkSpeed = attrDict.get(ShareDefine.Def_Effect_AtkSpeed, 0)
|
| | |
| | | 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):
|
| | | ##诛仙装备总评分
|
| | | return 10000000
|
| | | #---------------------------------------------------------------------
|
| | | ## 通过效果ID,检查是否为指定物品
|
| | | # @param curPlayer 当前玩家
|
| | |
| | | # 特殊判定根据时效时间判定物品是否可以使用
|
| | | # 过期物品不能使用或装备但是可以出售续费
|
| | | 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 物品实例
|
| | |
| | | return hasEnough, itemIndexList, findItemIsBind, needCnt
|
| | |
|
| | |
|
| | | def GetPackItemBindStateIndexInfo(curPlayer, itemID):
|
| | | def GetPackItemBindStateIndexInfo(curPlayer, itemID, needCount=0):
|
| | | ''' 获取背包消耗道具绑定及未绑定索引情况
|
| | | @param needCount: 所需个数, 默认绑定优先,当找到已经足够的个数后不再遍历,减少无用遍历
|
| | | @return: 可消耗物品列表[[绑定物品索引], [不绑定物品索引]], 绑定个数, 未绑定个数
|
| | | '''
|
| | | consumeItemIndexList = [[], []] # 可消耗物品列表[[绑定物品索引], [不绑定物品索引]]
|
| | |
| | | if curItem.GetIsBind():
|
| | | consumeItemIndexList[0].append(i)
|
| | | bindCnt += itemCount
|
| | | if needCount > 0 and bindCnt >= needCount:
|
| | | break
|
| | | else:
|
| | | consumeItemIndexList[1].append(i)
|
| | | unBindCnt += itemCount
|
| | |
| | | #系统提示 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):
|
| | |
| | |
|
| | | 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()
|
| | |
| | | ## 返回是否神兽装备
|
| | | return curItem.GetType() in ChConfig.Def_DogzEquiipType
|
| | |
|
| | | def GetIsZhuXianEquip(curItem):
|
| | | ## 返回是否诛仙装备
|
| | | return curItem.GetType() in ChConfig.Def_ZhuXianEquiipType
|
| | |
|
| | | ## 返回是否武器
|
| | | # @param curItem 当前物品
|
| | | # @return None
|
| | |
| | | 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=""):
|
| | |
| | | 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:
|