| | |
| | | # @return None
|
| | | def PlayerMagicWeaponLogin(curPlayer):
|
| | | NotifyMagicWeapon(curPlayer, True)
|
| | | Sycn_MagicWeaponRefineLV(curPlayer)
|
| | | SyncXBXZAwardRecord(curPlayer)
|
| | | Sycn_MagicWeaponLV(curPlayer)
|
| | | Sycn_MWPrivilegeData(curPlayer)
|
| | |
| | | activeCnt += 1
|
| | | return activeCnt
|
| | |
|
| | | def GetPotentialsSkillInfo(curPlayer):
|
| | | #通过潜力技能ID获取对应的下一个技能ID {skillUseType:{skillid:[skilllv,nextSkillid,addPower,]}}
|
| | | global g_potentialsSkillDict
|
| | |
|
| | | if not g_potentialsSkillDict:
|
| | | g_potentialsSkillDict = {}
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for i in xrange(ipyDataMgr.GetTreasureCount()):
|
| | | ipyData = ipyDataMgr.GetTreasureByIndex(i)
|
| | | mwID = ipyData.GetID()
|
| | | skillIDList = ipyData.GetPotentials()
|
| | | addPowerList = ipyData.GetSkillPower()
|
| | | lastSkillUseType = 0
|
| | | for curSkillID in skillIDList:
|
| | | skillData = GameWorld.GetGameData().FindSkillByType(curSkillID, 1)
|
| | | if skillData == None:
|
| | | GameWorld.DebugLog("GetPotentialsSkillInfo() hasn't find skill(%s)" % curSkillID)
|
| | | continue
|
| | | if lastSkillUseType != skillData.GetUseType():
|
| | | index = 0
|
| | | else:
|
| | | index +=1
|
| | | lastSkillUseType = skillData.GetUseType()
|
| | | addPower = addPowerList[index]
|
| | |
|
| | | preSkillID = skillData.GetLearnSkillReq()
|
| | | if not preSkillID:
|
| | | continue
|
| | | skillUseType = skillData.GetUseType()
|
| | | preSkilllv = skillData.GetLearnSkillLV()
|
| | | if skillUseType not in g_potentialsSkillDict:
|
| | | g_potentialsSkillDict[skillUseType] = {}
|
| | | g_potentialsSkillDict[skillUseType][preSkillID] = [preSkilllv, curSkillID, addPower]
|
| | | curskillUseType = pow(2, curPlayer.GetJob())
|
| | | |
| | | return g_potentialsSkillDict.get(curskillUseType, {})
|
| | |
|
| | | ## 给技能
|
| | | # @param curPlayer
|
| | | # @param skillResID 技能源ID
|
| | |
| | | PlayerControl.PlayerControl(curPlayer).RefreshSkillFightPowerEx(skillResID, 0)
|
| | | return
|
| | |
|
| | |
|
| | |
|
| | | #// A5 0D 升级法宝技能 #tagCMMagicWeaponSkillUp
|
| | | #
|
| | | #struct tagCMMagicWeaponSkillUp
|
| | | #{
|
| | | # tagHead Head;
|
| | | # WORD SkillTypeID;
|
| | | # BYTE CostIndex;
|
| | | #};
|
| | | def OnMagicWeaponSkillUp(index, clientData, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | skillTypeID = clientData.SkillTypeID
|
| | | costIndex = clientData.CostIndex #0代表未选中 1代表第一个
|
| | | |
| | | curSkillType = None
|
| | | SPSkillTypeDict = IpyGameDataPY.GetFuncEvalCfg('SPSkillType')
|
| | | for skillType, skillIDList in SPSkillTypeDict.items():
|
| | | if skillTypeID in skillIDList:
|
| | | curSkillType = int(skillType)
|
| | | break
|
| | | if curSkillType == None:
|
| | | #不是法宝技能
|
| | | return
|
| | | |
| | | #获得玩家技能管理器
|
| | | skillManager = curPlayer.GetSkillManager()
|
| | | #获得技能
|
| | | curSkill = skillManager.FindSkillBySkillTypeID(skillTypeID)
|
| | | if curSkill == None:
|
| | | curSkillLV = 0
|
| | | beforeFightPower = 0
|
| | | else:
|
| | | curSkillLV = curSkill.GetSkillLV()
|
| | | beforeFightPower = curSkill.GetFightPower()
|
| | | if curSkillLV == curSkill.GetSkillMaxLV():
|
| | | #已经是最高等级
|
| | | PlayerControl.NotifyCode(curPlayer, "UseMagicLost16")
|
| | | return
|
| | | |
| | | upSkillLv = curSkillLV + 1
|
| | | curSkillID = skillTypeID if not curSkill else curSkill.GetSkillID()
|
| | | upSkill = GameWorld.GetGameData().FindSkillByType(skillTypeID, upSkillLv)
|
| | | if not upSkill:
|
| | | GameWorld.DebugLog("技能升级配表错误 ID=%s lv=%s"%(skillTypeID, upSkillLv))
|
| | | return
|
| | | |
| | | if not SkillShell.CheckLearnSkillCondition(curPlayer, upSkill):
|
| | | return
|
| | | |
| | | #升级技能消耗
|
| | | ipyData = IpyGameDataPY.GetIpyGameData('TreasureSkill', curSkillType, upSkillLv)
|
| | | if not ipyData:
|
| | | return
|
| | | |
| | | needSP = ipyData.GetNeedPoint()
|
| | | if PlayerControl.GetZhenQi(curPlayer) < needSP:
|
| | | GameWorld.DebugLog("法宝sp不足,无法升级技能!needSP=%s,skillTypeID=%s" % (needSP, skillTypeID), curPlayer.GetPlayerID())
|
| | | return
|
| | | |
| | | initRate = ipyData.GetInitRate() #初始概率
|
| | | itemIndexList = []
|
| | | |
| | | if initRate != ShareDefine.Def_MaxRateValue and costIndex > 0:
|
| | | #满概率不消耗道具
|
| | | needItemIDList = ipyData.GetNeedItemID()
|
| | | needItemCntList = ipyData.GetNeedItemCnt()
|
| | | maxRateList = ipyData.GetMaxRate()
|
| | | if costIndex - 1 >= len(needItemIDList):
|
| | | GameWorld.Log("法宝技能升级,costIndex=%s 错误" % costIndex)
|
| | | return
|
| | | needItemID, needItemCnt, initRate = needItemIDList[costIndex - 1], needItemCntList[costIndex - 1], maxRateList[costIndex - 1]
|
| | | itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
| | | isEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(needItemID, itemPack, needItemCnt)
|
| | | if not isEnough:
|
| | | GameWorld.DebugLog("升级法宝技能() up skill(%s) item(%s) no enough" \
|
| | | % (upSkill.GetSkillID(), needItemID))
|
| | | return
|
| | | |
| | | |
| | | #扣物品
|
| | | if itemIndexList:
|
| | | ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, needItemCnt, False, ChConfig.ItemDel_MagicWeapon, |
| | | {"SkillTypeID":skillTypeID, "SkillLV":curSkillLV})
|
| | | |
| | | #付钱
|
| | | #infoDict = {"SkillID":skillTypeID, "SkillLV":upSkillLv, ChConfig.Def_Cost_Reason_SonKey:upSkill.GetSkillName()}
|
| | | if not PlayerControl.PlayerLostZhenQi(curPlayer, needSP):
|
| | | return
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | maxRateValue = ShareDefine.Def_MaxRateValue
|
| | | randValue = random.randint(0, maxRateValue-1)
|
| | | canHappen = randValue < initRate
|
| | | GameWorld.DebugLog("canHappen=%s,randValue=%s,initRate=%s,maxRateValue=%s" |
| | | % (canHappen, randValue, initRate, maxRateValue), playerID)
|
| | | # 不是百分百成功的记录合成流向
|
| | | if initRate != maxRateValue:
|
| | | drDict = {"PlayerID":playerID, "AccID":curPlayer.GetAccID(), "skillTypeID":skillTypeID, "IsSuccess":canHappen,
|
| | | "initRate":initRate, "randValue":randValue, "maxRateValue":maxRateValue}
|
| | |
|
| | | DataRecordPack.SendEventPack("MagicWeaponSkillUp", drDict, curPlayer)
|
| | |
|
| | | if not canHappen:
|
| | | GameWorld.DebugLog("法宝技能升级,curSkillID=%s, maxRate=%s 升级失败" % (curSkillID, initRate))
|
| | | curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitMagicWeaponSkillUp, 0)
|
| | | return
|
| | | curControl = PlayerControl.PlayerControl(curPlayer)
|
| | | skillManager.LVUPSkillByID(curSkillID)
|
| | | #触发学习新技能
|
| | | newSkillIsPassive = False
|
| | | potentialSkillLearnDict = IpyGameDataPY.GetFuncEvalCfg('PotentialSkillLearn')
|
| | | if str(skillTypeID) in potentialSkillLearnDict:
|
| | | needSkllLV, newSkillID = potentialSkillLearnDict[str(skillTypeID)]
|
| | | if upSkillLv == needSkllLV:
|
| | | if not skillManager.FindSkillBySkillTypeID(newSkillID):
|
| | | newSkill = GameWorld.GetGameData().FindSkillByType(newSkillID, 1)
|
| | | if newSkill:
|
| | | skillManager.LVUPSkillByID(newSkillID)
|
| | | GameWorld.DebugLog(' 法宝技能升级 skillTypeID=%s, upSkillLv=%s, 触发学习技能%s' % (skillTypeID, upSkillLv, newSkillID))
|
| | | curControl.RefreshSkillFightPowerEx(newSkillID, 0)
|
| | | PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer, newSkillID)
|
| | | if SkillCommon.isPassiveAttr(newSkill):
|
| | | newSkillIsPassive = True
|
| | | PlayerControl.WorldNotify(0, 'SkillPotential2', [curPlayer.GetName(), skillTypeID, upSkillLv, newSkillID])
|
| | | |
| | | |
| | | #通知技能已升级成功
|
| | | hasUnlockSkill = False
|
| | | nextSkillDict = GetPotentialsSkillInfo(curPlayer)
|
| | | if skillTypeID in nextSkillDict:
|
| | | needSkilllv,nextSkillID = nextSkillDict[skillTypeID][:2]
|
| | | if upSkillLv == needSkilllv:
|
| | | PlayerControl.WorldNotify(0, 'SkillPotential1', [curPlayer.GetName(), skillTypeID, upSkillLv, nextSkillID])
|
| | | CalcMagicWeaponAttr(curPlayer)
|
| | | hasUnlockSkill = True
|
| | | |
| | | maxLV = upSkill.GetSkillMaxLV()
|
| | | if upSkillLv == maxLV:
|
| | | PlayerControl.WorldNotify(0, 'SkillPotential3', [curPlayer.GetName(), skillTypeID, maxLV])
|
| | | |
| | | if SkillCommon.isPassiveAttr(upSkill) or newSkillIsPassive or hasUnlockSkill:
|
| | | curControl.RefreshPlayerAttrState()
|
| | | |
| | | curControl.RefreshSkillFightPowerEx(upSkill.GetSkillID(), beforeFightPower)
|
| | | PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer, upSkill.GetSkillID())
|
| | | |
| | | #获得技能等级
|
| | | #curSkillLV = curSkill.GetSkillLV()
|
| | | GameWorld.DebugLog(' 法宝技能升级 skillTypeID=%s, upSkillLv=%s' % (skillTypeID, upSkillLv))
|
| | | DataRecordPack.DR_LearnORUPSkill(curPlayer, skillTypeID, upSkillLv)
|
| | | |
| | | curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitMagicWeaponSkillUp, 1)
|
| | | |
| | | SetMWPrivilegeData(curPlayer, ChConfig.MWPrivilege_MWSkillUp, GetSPSkillTotalLV(curPlayer))
|
| | | PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_MWSkillUp, 1, [skillTypeID])
|
| | | EventShell.EventRespons_MWSkillUp(curPlayer)
|
| | | return
|
| | |
|
| | | def GetSPSkillTotalLV(curPlayer):
|
| | | #潜力技能总等级
|
| | | totalLV = 0
|
| | | skillManager = curPlayer.GetSkillManager()
|
| | | for i in xrange(skillManager.GetSkillCount()):
|
| | | curSkill = skillManager.GetSkillByIndex(i)
|
| | | if curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_FbSPSkill:
|
| | | continue
|
| | | totalLV += curSkill.GetSkillLV()
|
| | | return totalLV
|
| | |
|
| | | def NotifyMagicWeapon(curPlayer, isLogin=False):
|
| | | #通知法宝信息
|
| | |
| | | PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_MagicWeapon2, allAttrList2)
|
| | | PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_MagicWeapon3, allAttrList3)
|
| | | PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_MagicWeapon4, allAttrList4)
|
| | | #技能解锁战力
|
| | | nextSkillDict = GetPotentialsSkillInfo(curPlayer)
|
| | | for skillID, info in nextSkillDict.items():
|
| | | needSkilllv, nextSkillID, addPower = info
|
| | | skillManager = curPlayer.GetSkillManager()
|
| | | curSkill = skillManager.FindSkillBySkillTypeID(skillID)
|
| | | if not curSkill:
|
| | | continue
|
| | | curSkillLV = curSkill.GetSkillLV()
|
| | | if curSkillLV < needSkilllv:
|
| | | continue
|
| | | mfpType = ChConfig.Def_SkillFuncType_MFPType.get(curSkill.GetFuncType(), ShareDefine.Def_MFPType_Role)
|
| | | addPowerDict[mfpType] = addPowerDict.get(mfpType, 0) + addPower
|
| | | |
| | | for mfpType, addPower in addPowerDict.items():
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % mfpType, addPower)
|
| | | return
|
| | |
|
| | | #// A5 77 玩家精炼法宝 #tagCMMWRefine
|
| | | #
|
| | | #struct tagCMMWRefine
|
| | | #{
|
| | | # tagHead Head;
|
| | | # DWORD MWID; // 法宝ID
|
| | | # DWORD MaterialID; //材料ID
|
| | | #};
|
| | | def PlayerMWRefine(index, clientPack, tick):
|
| | | mwID = clientPack.MWID # 法宝ID
|
| | | materialID = clientPack.MaterialID # 提升概率物品ID
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | allTreasureItemIDList = IpyGameDataPY.GetFuncEvalCfg("TreasureUpRateItem")
|
| | | if mwID not in allTreasureItemIDList:
|
| | | GameWorld.DebugLog("该法宝不能铸炼-法宝ID:%s" % mwID, playerID)
|
| | | return
|
| | | |
| | | isActive = GetIsActiveMagicWeapon(curPlayer, mwID)
|
| | | if not isActive:
|
| | | GameWorld.DebugLog("法宝未激活,不能铸炼-法宝ID:%s" % mwID, playerID)
|
| | | return
|
| | | |
| | | nextRefineLv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponRefineLV % mwID) + 1
|
| | | mwRefineIpyData = GetMWRefineIpyData(mwID, nextRefineLv)
|
| | | if not mwRefineIpyData:
|
| | | GameWorld.DebugLog("法宝已满级,不能铸炼-法宝ID:%s, nextRefineLv=%s" % (mwID, nextRefineLv), playerID)
|
| | | return
|
| | | |
| | | # 所需炼丹炉等级
|
| | | alchemyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV)
|
| | | if alchemyLV < mwRefineIpyData.GetNeedAlchemyLV():
|
| | | GameWorld.DebugLog("炼丹炉等级不足,无法铸炼法宝-法宝ID:%s, nextRefineLv=%s,alchemyLV=%s,NeedAlchemyLV=%s" |
| | | % (mwID, nextRefineLv, alchemyLV, mwRefineIpyData.GetNeedAlchemyLV()), playerID)
|
| | | return
|
| | | |
| | | # 所需所有法宝等级
|
| | | needAllTreasureLV = mwRefineIpyData.GetNeedAllTreasureLV()
|
| | | for tID in allTreasureItemIDList:
|
| | | if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponRefineLV % tID) < needAllTreasureLV:
|
| | | GameWorld.DebugLog("所有法宝需达到对应等级后才可继续铸炼! needAllTreasureLV=%s" % needAllTreasureLV, playerID)
|
| | | return
|
| | | |
| | | needItemDict = mwRefineIpyData.GetMaterial()
|
| | | |
| | | fujiaRate = 0
|
| | | if materialID:
|
| | | treasureUpRateItem = IpyGameDataPY.GetFuncEvalCfg("TreasureUpRateItem", 2)
|
| | | if materialID not in treasureUpRateItem:
|
| | | GameWorld.ErrLog("该物品ID无法用于提升法宝铸炼概率!itemID=%s" % (materialID), playerID)
|
| | | return
|
| | | rateItemData = GameWorld.GetGameData().GetItemByTypeID(materialID)
|
| | | if not rateItemData:
|
| | | return
|
| | | fujiaRate = rateItemData.GetEffectByIndex(0).GetEffectValue(0)
|
| | | needItemDict[materialID] = 1
|
| | | |
| | | itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
| | | lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemDict, itemPack)
|
| | | if lackItemDict:
|
| | | GameWorld.DebugLog("法宝铸炼材料不足!法宝ID:%s, nextRefineLv=%s,needItemDict=%s,lackItemDict=%s,hasItemDict=%s" |
| | | % (mwID, nextRefineLv, needItemDict, lackItemDict, delInfoDict), playerID)
|
| | | return
|
| | | ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, ChConfig.ItemDel_MagicWeapon)
|
| | | |
| | | successRate = mwRefineIpyData.GetSuccessRate() + fujiaRate
|
| | | if GameWorld.CanHappen(successRate):
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MagicWeaponRefineLV % mwID, nextRefineLv)
|
| | | skillID = mwRefineIpyData.GetOpenSkill()
|
| | | if skillID:
|
| | | GiveSkill(curPlayer, skillID, tick)
|
| | | CalcMagicWeaponAttr(curPlayer)
|
| | | PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
|
| | | #通知客户端 |
| | | Sycn_MagicWeaponRefineLV(curPlayer, mwID)
|
| | | curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitMWUpLevel, ChConfig.Def_ComposeState_Sucess)
|
| | | GameWorld.DebugLog("法宝铸炼成功! 法宝ID:%s, upRefineLv=%s,successRate=%s" % (mwID, nextRefineLv, successRate), playerID)
|
| | | else:
|
| | | curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitMWUpLevel, ChConfig.Def_ComposeState_Fail)
|
| | | GameWorld.DebugLog("法宝铸炼失败! 法宝ID:%s, nextRefineLv=%s,successRate=%s" % (mwID, nextRefineLv, successRate), playerID)
|
| | | |
| | | return
|
| | |
|
| | | def Sycn_MagicWeaponRefineLV(curPlayer, mwID= -1):
|
| | | if mwID == -1:
|
| | | needCalList = IpyGameDataPY.GetFuncEvalCfg("TreasureUpRateItem")
|
| | | else:
|
| | | needCalList = [mwID]
|
| | | sendPack = ChPyNetSendPack.tagMCMagicWeaponMsg()
|
| | | sendPack.MWInfo = []
|
| | | for mwID in needCalList:
|
| | | mwRefineLv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponRefineLV % mwID)
|
| | | if not mwRefineLv:
|
| | | continue
|
| | | pack = ChPyNetSendPack.tagMCMagicWeaponLV()
|
| | | pack.MWID = mwID
|
| | | pack.MWLV = mwRefineLv
|
| | | sendPack.MWInfo.append(pack)
|
| | | sendPack.Count = len(sendPack.MWInfo)
|
| | | if sendPack.Count:
|
| | | NetPackCommon.SendFakePack(curPlayer, sendPack)
|
| | | return
|
| | |
|
| | | #// A5 0E 开启法宝 #tagCMOpenMagicWeapon
|
| | | #
|