xdh
2018-09-28 78e817e23677187c8ad9fea93aff706839a30d5f
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGreatMaster.py
@@ -6,55 +6,46 @@
#
##@package Player.PlayerGreatMaster
#
# @todo:大师系统
# @author hxp
# @date 2015-2-27
# @version 1.8
# @todo:天赋系统
# @author xdh
# @date 2018-9-26
# @version 1.0
#
# @change: "2015-03-05 11:00" hxp 根据大师等级获取大师所需升级经验
# @change: "2015-03-07 00:00" hxp 天赋buff刷属性时机修改
# @change: "2015-03-07 04:10" ljd 保存成功系统提示
# @change: "2015-05-28 14:00" hxp 刷属性优化
# @change: "2015-07-29 15:20" xdh 大师改成等级开启
# @change: "2015-08-24 14:40" zqx 增加分配x点天赋点成就
# @change: "2016-01-26 15:00" hxp PY表支持重读
# @change: "2016-06-02 20:00" hxp 功能开放逻辑修改
#
# 详细描述: 大师系统
# 详细描述: 天赋系统
#
#---------------------------------------------------------------------
#"""Version = 2016-06-02 20:00"""
#"""Version = 2018-9-26 20:00"""
import GameWorld
import PyMapTable
import PlayerControl
import IPY_GameWorld
import PlayerBillboard
import ChPyNetSendPack
import DataRecordPack
import NetPackCommon
import ReadChConfig
import SkillCommon
import ShareDefine
import SkillShell
import BuffSkill
import ChConfig
import PlayerSuccess
import GameFuncComm
import IpyGameDataPY
import ItemCommon
## 大师功能是否开启
#  @param curPlayer
#  @return
def IsGreatMasterOpen(curPlayer):
#    curReinCnt = curPlayer.GetReincarnationLv() # 当前转生次数
#    if curReinCnt < 3:
#        return False
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_GreatMaster):
        return False
    return True
## 登录处理
#  @param curPlayer
#  @return
def MasterOnLogin(curPlayer):
    if not IsGreatMasterOpen(curPlayer):
        return
    Sync_GreatMasterFreeSkillPoint(curPlayer)
    return
## 增加大师天赋点
#  @param curPlayer
@@ -67,71 +58,7 @@
    SetGreatMasterFreeSkillPoint(curPlayer, curFreeSkillPoint + addPoint)
    Sync_GreatMasterFreeSkillPoint(curPlayer)
    return
## 转生处理
#  @param curPlayer
#  @return
def OnReincarnation(curPlayer):
    #如果是满级的,则多余经验转移到大师经验
    isFullLV = curPlayer.GetLVEx() >= IpyGameDataPY.GetFuncCfg("PlayerMaxLV") # 玩家已满级
    if not isFullLV:
        return
    curTotalExp = PlayerControl.GetPlayerTotalExp(curPlayer) # 当前经验
    PlayerControl.SetPlayerTotalExp(curPlayer, 0)
    AddGreatMasterExp(curPlayer, curTotalExp)
    return
## 登录处理
#  @param curPlayer
#  @return
def MasterOnLogin(curPlayer):
    if not IsGreatMasterOpen(curPlayer):
        return
    Sync_GreatMasterExp(curPlayer)
    Sync_GreatMasterFreeSkillPoint(curPlayer)
    return
## 获取当前大师经验(不算经验点的)
def GetCurGreatMasterExp(curPlayer):
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Master_Exp, 0, ChConfig.Def_PDictType_GreatMaster)
## 设置当前大师经验(不算经验点的)
def SetCurGreatMasterExp(curPlayer, value):
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Master_Exp, value, ChConfig.Def_PDictType_GreatMaster)
    return
## 获取当前大师经验点
def GetGreatMasterExpPoint(curPlayer):
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Master_ExpPoint, 0, ChConfig.Def_PDictType_GreatMaster)
## 设置当前大师经验点
def SetGreatMasterExpPoint(curPlayer, value):
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Master_ExpPoint, value, ChConfig.Def_PDictType_GreatMaster)
    return
## 获取当前大师总经验(包含经验点)
def GetTotalGreatMasterExp(curPlayer):
    masterExp = GetCurGreatMasterExp(curPlayer)
    masterExpPoint = GetGreatMasterExpPoint(curPlayer)
    totalMasterExp = masterExpPoint * ChConfig.Def_PerPointValue + masterExp
    return totalMasterExp
## 设置当前大师总经验(包含经验点)
def SetTotalGreatMasterExp(curPlayer, totalExp):
    curExp = totalExp % ChConfig.Def_PerPointValue
    expPoint = totalExp / ChConfig.Def_PerPointValue
    # 更新大师经验、经验点
    SetCurGreatMasterExp(curPlayer, curExp)
    SetGreatMasterExpPoint(curPlayer, expPoint)
    #GameWorld.DebugLog("SetTotalGreatMasterExp totalExp=%s,expPoint=%s,curExp=%s"
    #                   % (totalExp, expPoint, curExp), curPlayer.GetPlayerID())
    Sync_GreatMasterExp(curPlayer)
    return
## 获取当前剩余大师技能点
def GetGreatMasterFreeSkillPoint(curPlayer):
@@ -142,161 +69,12 @@
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Master_FreeSkillPoint, value, ChConfig.Def_PDictType_GreatMaster)
    return
## 根据大师等级获取升级所需经验
#  @param masterLV: 大师等级
#  @return: -1-已满级; >=0升级所需经验
def GetTotalExpByGreatMasterLV(masterLV):
    masterExpTable = PyMapTable.GetPyMapTable("GreatMasterExp")
    maxMasterLV = masterExpTable.GetRecordCount() - 1
    if masterLV >= maxMasterLV:
        return -1
    expInfoList = masterExpTable.GetRecordByIndex(masterLV)
    totalExp = int(expInfoList["Exp"])
    return totalExp
## 增加大师等级经验
#  @param curPlayer
#  @param addExp
#  @return 是否成功
def AddGreatMasterExp(curPlayer, addExp):
    # 取消大师等级
    return
    if not IsGreatMasterOpen(curPlayer):
        return False
    #取得人物当前经验
    playerID = curPlayer.GetPlayerID()
    masterLV = curPlayer.GetLV2() # 大师等级, 从0级开始
    masterExpTable = PyMapTable.GetPyMapTable("GreatMasterExp")
    maxMasterLV = masterExpTable.GetRecordCount() - 1
    #GameWorld.DebugLog("增加大师等级经验 addExp=%s,masterLV=%s,maxMasterLV=%s"
    #                   % (addExp, masterLV, maxMasterLV), playerID)
    if masterLV >= maxMasterLV:
        PlayerControl.NotifyCode(curPlayer, "GeRen_admin_825676")
        GameWorld.DebugLog("大师等级已满级!", playerID)
        return False
    curTotalMasterExp = GetTotalGreatMasterExp(curPlayer) + addExp
    # 先加再处理升级
    SetTotalGreatMasterExp(curPlayer, curTotalMasterExp)
    expInfoList = masterExpTable.GetRecordByIndex(masterLV)
    needExp = int(expInfoList["Exp"])
    if needExp <= 0:
        GameWorld.ErrLog("大师升级所需经验配置错误!masterLV=%s,needExp=%s" % (masterLV, needExp), playerID)
        return True
    #GameWorld.DebugLog("    expInfoList=%s,needExp=%s,curTotalMasterExp=%s"
    #                   % (str(expInfoList), needExp, curTotalMasterExp), playerID)
    isLVUP = False
    while curTotalMasterExp >= needExp:
        isLVUP = True
        masterLV += 1
        curPlayer.SetLV2(masterLV)
        curTotalMasterExp -= needExp
        #GameWorld.DebugLog("    大师等级升级needExp=%s,nextMasterLV=%s,curTotalMasterExp=%s"
        #                   % (needExp, masterLV, curTotalMasterExp), playerID)
        # 给大师天赋点
        addSkillPoint = int(expInfoList["AddSkillPoint"])
        curFreeSkillPoint = GetGreatMasterFreeSkillPoint(curPlayer)
        SetGreatMasterFreeSkillPoint(curPlayer, curFreeSkillPoint + addSkillPoint)
        # 升级流向
        DataRecordPack.DR_PlayerMasterLVChange(curPlayer, curTotalMasterExp)
        # 循环升级
        if masterLV >= maxMasterLV:
            GameWorld.DebugLog("    循环升级大师等级已满级!", playerID)
            break
        expInfoList = masterExpTable.GetRecordByIndex(masterLV)
        needExp = int(expInfoList["Exp"])
        if needExp <= 0:
            GameWorld.DebugLog("    循环升级下一级经验为0!masterLV=%s" % masterLV, playerID)
            break
    # 升级处理
    if isLVUP:
        #GameWorld.DebugLog("    大师升级处理!", playerID)
        PlayerBillboard.UpdatePlayerLVBillboard(curPlayer)
        #重刷所有属性
        PlayerControl.PlayerControl(curPlayer).RefreshAllState()
        #将血设置为最大
        curPlayer.SetHP(curPlayer.GetMaxHP())
        curPlayer.SetMP(curPlayer.GetMaxMP())
        Sync_GreatMasterFreeSkillPoint(curPlayer)
        # 更新剩余总经验
        SetTotalGreatMasterExp(curPlayer, curTotalMasterExp)
    return True
## 同步大师经验
#  @param curPlayer
#  @return
def Sync_GreatMasterExp(curPlayer):
    masterExpPack = ChPyNetSendPack.tagMCGreatMasterExp()
    masterExpPack.Clear()
    masterExpPack.MasterExpPoint = GetGreatMasterExpPoint(curPlayer)
    masterExpPack.CurMasterEXP = GetCurGreatMasterExp(curPlayer)
    NetPackCommon.SendFakePack(curPlayer, masterExpPack)
    return
## 同步大师剩余天赋点
#  @param curPlayer
#  @return 
def Sync_GreatMasterFreeSkillPoint(curPlayer):
    #PlayerControl.NotifyPlayerDictValue(curPlayer, ChConfig.Def_PDict_Master_FreeSkillPoint)
    return
#// A5 48 兑换大师等级经验 #tagCMExchangeMasterEXP
#
#struct    tagCMExchangeMasterEXP
#{
#    tagHead        Head;
#    BYTE        Multiples;        // 20亿经验倍数
#    DWORD        ExtraExp;    // 额外附加经验(不超过20亿)
#};
## 兑换大师经验
#  @param index: 玩家索引
#  @param clientData: 封包结构体
#  @param tick: 时间戳
#  @return: None
def OnExchangeMasterExp(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    if not IsGreatMasterOpen(curPlayer):
        GameWorld.ErrLog("大师功能未开启!不能兑换大师等级经验!", curPlayer.GetPlayerID())
        return
    exchangeExp = clientData.Multiples * ChConfig.Def_PerPointValue + clientData.ExtraExp
    curTotalExp = PlayerControl.GetPlayerTotalExp(curPlayer) # 当前经验
    actualExchangeExp = min(curTotalExp, exchangeExp)
    GameWorld.DebugLog("兑换大师等级经验ExchangeExp=%s" % actualExchangeExp, curPlayer.GetPlayerID())
    if actualExchangeExp <= 0:
        return
    updTotalExp = curTotalExp - actualExchangeExp
    PlayerControl.SetPlayerTotalExp(curPlayer, updTotalExp)
    AddGreatMasterExp(curPlayer, actualExchangeExp)
    curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_TalentPoint, GetGreatMasterFreeSkillPoint(curPlayer), False)
    return
@@ -321,172 +99,173 @@
#  @param tick: 时间戳
#  @return: None
def OnAddMasterSkillPoint(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    needAddSkillPointList = clientData.AddSkillPointList
    if not needAddSkillPointList:
        return
    reqTotalPointSkillDict = ReadChConfig.GetEvalChConfig("ReqTotalPointSkill")
    greatMasterSkillDict = ReadChConfig.GetEvalChConfig("GreatMasterSkill")
    jobType = ChConfig.JOB_TYPE_DICT[curPlayer.GetJob()]
    if jobType not in greatMasterSkillDict:
        return
    jobMasterSkillDict = greatMasterSkillDict[jobType] # 本职业天赋系对应技能
    reqTotalPointSkillList = reqTotalPointSkillDict.get(jobType, []) # 本职业需求总天赋点技能
    skillTypeSeriesDict = {} # 技能对应天赋系
    skillTypeLVDict = {} # 技能对应等级
    seriesTotalPointDict = {} # 天赋系对应总技能点
    allSeriesTotalPoint = 0 # 所有天赋系总点数
    # 汇总天赋技能所属天赋系
    for seriesType, skillTypeIDList in jobMasterSkillDict.items():
        for sTypeID in skillTypeIDList:
            skillTypeSeriesDict[sTypeID] = seriesType
    skillManager = curPlayer.GetSkillManager()
    # 获取玩家目前所有技能
    for i in range(skillManager.GetSkillCount()):
        playerSkill = skillManager.GetSkillByIndex(i)
        if playerSkill == None:
            continue
        playerSkillTypeID = playerSkill.GetSkillTypeID()
        for seriesType, skillTypeIDList in jobMasterSkillDict.items():
            if playerSkillTypeID not in skillTypeIDList:
                continue
            skillLV = playerSkill.GetSkillLV()
            skillTypeLVDict[playerSkillTypeID] = skillLV
            seriesTotalPointDict[seriesType] = seriesTotalPointDict.get(seriesType, 0) + skillLV
            allSeriesTotalPoint += skillLV
            break
    isAddSkill = True
    isRefreshAttr = False
    buffType = IPY_GameWorld.btPassiveBuf
    addPointDict = {} # 请求加点技能已执行加点数
    GameWorld.DebugLog("【天赋加点】jobType=%s,技能对应等级=%s,天赋系对应总技能点=%s,总点数=%s"
                       % (jobType, skillTypeLVDict, seriesTotalPointDict, allSeriesTotalPoint))
    while isAddSkill:
        # 每次循环重置状态,直到无法再加技能才跳出
        isAddSkill = False
        for addSkill in needAddSkillPointList:
            skillTypeID = addSkill.SkillID
            totalAddPoint = addSkill.AddPoint
            freeSkillPoint = GetGreatMasterFreeSkillPoint(curPlayer)
            if freeSkillPoint <= 0:
                GameWorld.DebugLog("    当前无剩余天赋点!")
                break
            if skillTypeID not in skillTypeSeriesDict:
                GameWorld.ErrLog("技能不在合法天赋系里!skillTypeID=%s" % skillTypeID)
                continue
            curSeriesType = skillTypeSeriesDict[skillTypeID]
            addPoint = addPointDict.get(skillTypeID, 0) # 该技能已执行加点数
            # 已经达到请求加的点数,不再处理
            if addPoint >= totalAddPoint:
                #GameWorld.DebugLog("    已经加到请求加的点数,不再处理!skillTypeID=%s,addPoint=%s" % (skillTypeID, addPoint))
                continue
            curSkill = skillManager.FindSkillBySkillTypeID(skillTypeID)
            # δѧϰ
            if not curSkill:
                learnSkillLV = 1
            # 已学习
            else:
                curSkillLV = curSkill.GetSkillLV()
                curSkillMaxLV = curSkill.GetSkillMaxLV()
                if curSkillLV >= curSkillMaxLV:
                    GameWorld.DebugLog("    技能已满级!skillTypeID=%s" % (skillTypeID))
                    continue
                learnSkillLV = curSkillLV + 1
            learnSkillData = GameWorld.GetGameData().FindSkillByType(skillTypeID, learnSkillLV)
            if not learnSkillData:
                GameWorld.ErrLog("找不到学习技能数据:skillTypeID=%s,skillLV=%s" % (skillTypeID, learnSkillLV))
                continue
            learnSkillID = learnSkillData.GetSkillID()
            skillLearnReq = learnSkillData.GetLearnSkillReq()
            skillLearnReqLV = learnSkillData.GetLearnSkillLV()
            skillLearnSeriesPointReq = learnSkillData.GetLearnSkillPointReq()
            # 前置技能点数需求
            reqSkillLV = skillTypeLVDict.get(skillLearnReq, 0)
            if skillLearnReq > 0 and skillTypeLVDict.get(skillLearnReq, 0) < skillLearnReqLV:
                #GameWorld.DebugLog("    前置技能加点未满足!learnSkillID=%s,[前置技能%s 当前%s点 需%s点]"
                #                   % (learnSkillID, skillLearnReq, reqSkillLV, skillLearnReqLV))
                continue
            # 天赋系点数需求
            if skillLearnSeriesPointReq > 0:
                isReqAllPoint = skillTypeID in reqTotalPointSkillList # 是否需求所有系总点数
                # 已加总天赋点数不足
                if isReqAllPoint and allSeriesTotalPoint < skillLearnSeriesPointReq:
                    #GameWorld.DebugLog("    总天赋点数不足!learnSkillID=%s,curPoint=%s,reqPoint=%s"
                    #                   % (learnSkillID, allSeriesTotalPoint, skillLearnSeriesPointReq))
                    continue
                # 已加本系天赋点数不足
                curSeriesTotalPoint = seriesTotalPointDict.get(curSeriesType, 0)
                if not isReqAllPoint and curSeriesTotalPoint < skillLearnSeriesPointReq:
                    #GameWorld.DebugLog("    本系天赋点数不足!learnSkillID=%s,curSeriesType=%s,curPoint=%s,reqPoint=%s"
                    #                   % (learnSkillID, curSeriesType, curSeriesTotalPoint, skillLearnSeriesPointReq))
                    continue
            # 可加点, 下面执行该技能加点
            skillManager.LVUpSkillBySkillTypeID(skillTypeID)
            DataRecordPack.DR_LearnORUPSkill(curPlayer, skillTypeID, learnSkillLV)
            # 是被动技能要重刷属性
            #if SkillCommon.isPassiveBuffSkill(learnSkillData):
            #    BuffSkill.AddBuffNoRefreshState(curPlayer, buffType, learnSkillData, tick, [], curPlayer)
            #    isRefreshAttr = True
            isAddSkill = True
            addPointDict[skillTypeID] = addPoint + 1
            skillTypeLVDict[skillTypeID] = learnSkillLV
            seriesTotalPointDict[curSeriesType] = seriesTotalPointDict.get(curSeriesType, 0) + 1
            allSeriesTotalPoint += 1
            SetGreatMasterFreeSkillPoint(curPlayer, freeSkillPoint - 1)
            # 成就
            #successKey = ChConfig.Def_PDict_Success_CntValue%(ShareDefine.SuccType_TalentPoint, 0)
            #curSuccess = PlayerSuccess.GetPDictValue(curPlayer, successKey)
            #if curSuccess < allSeriesTotalPoint:
            #    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_TalentPoint, 1)
            #GameWorld.DebugLog("    加天赋技能 learnSkillID=%s,skillTypeID=%s,skillLV=%s,doCnt=%s,needCnt=%s"
            #                   % (learnSkillID, skillTypeID, learnSkillLV, addPoint + 1, totalAddPoint))
        #GameWorld.DebugLog("    isAddSkill=%s" % isAddSkill)
    if isRefreshAttr:
        curControl = PlayerControl.PlayerControl(curPlayer)
        #curControl.CalcPassiveBuffAttr()
        curControl.RefreshPlayerAttrByBuff()
    PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_224510")
    Sync_GreatMasterFreeSkillPoint(curPlayer)
    return
    return #现版本加点方式不同 使用03 04 玩家学习技能#tagCAddSkillPoint,此处先屏蔽
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#
#    needAddSkillPointList = clientData.AddSkillPointList
#
#    if not needAddSkillPointList:
#        return
#
#    reqTotalPointSkillDict = ReadChConfig.GetEvalChConfig("ReqTotalPointSkill")
#    greatMasterSkillDict = ReadChConfig.GetEvalChConfig("GreatMasterSkill")
#    jobType = ChConfig.JOB_TYPE_DICT[curPlayer.GetJob()]
#
#    if jobType not in greatMasterSkillDict:
#        return
#
#    jobMasterSkillDict = greatMasterSkillDict[jobType] # 本职业天赋系对应技能
#    reqTotalPointSkillList = reqTotalPointSkillDict.get(jobType, []) # 本职业需求总天赋点技能
#
#    skillTypeSeriesDict = {} # 技能对应天赋系
#    skillTypeLVDict = {} # 技能对应等级
#    seriesTotalPointDict = {} # 天赋系对应总技能点
#    allSeriesTotalPoint = 0 # 所有天赋系总点数
#
#    # 汇总天赋技能所属天赋系
#    for seriesType, skillTypeIDList in jobMasterSkillDict.items():
#        for sTypeID in skillTypeIDList:
#            skillTypeSeriesDict[sTypeID] = seriesType
#
#    skillManager = curPlayer.GetSkillManager()
#
#    # 获取玩家目前所有技能
#    for i in range(skillManager.GetSkillCount()):
#        playerSkill = skillManager.GetSkillByIndex(i)
#        if playerSkill == None:
#            continue
#
#        playerSkillTypeID = playerSkill.GetSkillTypeID()
#
#        for seriesType, skillTypeIDList in jobMasterSkillDict.items():
#            if playerSkillTypeID not in skillTypeIDList:
#                continue
#
#            skillLV = playerSkill.GetSkillLV()
#            skillTypeLVDict[playerSkillTypeID] = skillLV
#            seriesTotalPointDict[seriesType] = seriesTotalPointDict.get(seriesType, 0) + skillLV
#            allSeriesTotalPoint += skillLV
#            break
#
#    isAddSkill = True
#    isRefreshAttr = False
#    buffType = IPY_GameWorld.btPassiveBuf
#    addPointDict = {} # 请求加点技能已执行加点数
#
#    GameWorld.DebugLog("【天赋加点】jobType=%s,技能对应等级=%s,天赋系对应总技能点=%s,总点数=%s"
#                       % (jobType, skillTypeLVDict, seriesTotalPointDict, allSeriesTotalPoint))
#
#    while isAddSkill:
#        # 每次循环重置状态,直到无法再加技能才跳出
#        isAddSkill = False
#
#        for addSkill in needAddSkillPointList:
#            skillTypeID = addSkill.SkillID
#            totalAddPoint = addSkill.AddPoint
#
#            freeSkillPoint = GetGreatMasterFreeSkillPoint(curPlayer)
#            if freeSkillPoint <= 0:
#                GameWorld.DebugLog("    当前无剩余天赋点!")
#                break
#
#            if skillTypeID not in skillTypeSeriesDict:
#                GameWorld.ErrLog("技能不在合法天赋系里!skillTypeID=%s" % skillTypeID)
#                continue
#
#            curSeriesType = skillTypeSeriesDict[skillTypeID]
#
#            addPoint = addPointDict.get(skillTypeID, 0) # 该技能已执行加点数
#
#            # 已经达到请求加的点数,不再处理
#            if addPoint >= totalAddPoint:
#                #GameWorld.DebugLog("    已经加到请求加的点数,不再处理!skillTypeID=%s,addPoint=%s" % (skillTypeID, addPoint))
#                continue
#
#            curSkill = skillManager.FindSkillBySkillTypeID(skillTypeID)
#
#            # δѧϰ
#            if not curSkill:
#                learnSkillLV = 1
#            # 已学习
#            else:
#                curSkillLV = curSkill.GetSkillLV()
#                curSkillMaxLV = curSkill.GetSkillMaxLV()
#                if curSkillLV >= curSkillMaxLV:
#                    GameWorld.DebugLog("    技能已满级!skillTypeID=%s" % (skillTypeID))
#                    continue
#
#                learnSkillLV = curSkillLV + 1
#
#            learnSkillData = GameWorld.GetGameData().FindSkillByType(skillTypeID, learnSkillLV)
#
#            if not learnSkillData:
#                GameWorld.ErrLog("找不到学习技能数据:skillTypeID=%s,skillLV=%s" % (skillTypeID, learnSkillLV))
#                continue
#
#            learnSkillID = learnSkillData.GetSkillID()
#            skillLearnReq = learnSkillData.GetLearnSkillReq()
#            skillLearnReqLV = learnSkillData.GetLearnSkillLV()
#            skillLearnSeriesPointReq = learnSkillData.GetLearnSkillPointReq()
#
#            # 前置技能点数需求
#            reqSkillLV = skillTypeLVDict.get(skillLearnReq, 0)
#            if skillLearnReq > 0 and skillTypeLVDict.get(skillLearnReq, 0) < skillLearnReqLV:
#                #GameWorld.DebugLog("    前置技能加点未满足!learnSkillID=%s,[前置技能%s 当前%s点 需%s点]"
#                #                   % (learnSkillID, skillLearnReq, reqSkillLV, skillLearnReqLV))
#                continue
#
#            # 天赋系点数需求
#            if skillLearnSeriesPointReq > 0:
#                isReqAllPoint = skillTypeID in reqTotalPointSkillList # 是否需求所有系总点数
#
#                # 已加总天赋点数不足
#                if isReqAllPoint and allSeriesTotalPoint < skillLearnSeriesPointReq:
#                    #GameWorld.DebugLog("    总天赋点数不足!learnSkillID=%s,curPoint=%s,reqPoint=%s"
#                    #                   % (learnSkillID, allSeriesTotalPoint, skillLearnSeriesPointReq))
#                    continue
#
#                # 已加本系天赋点数不足
#                curSeriesTotalPoint = seriesTotalPointDict.get(curSeriesType, 0)
#                if not isReqAllPoint and curSeriesTotalPoint < skillLearnSeriesPointReq:
#                    #GameWorld.DebugLog("    本系天赋点数不足!learnSkillID=%s,curSeriesType=%s,curPoint=%s,reqPoint=%s"
#                    #                   % (learnSkillID, curSeriesType, curSeriesTotalPoint, skillLearnSeriesPointReq))
#                    continue
#
#            # 可加点, 下面执行该技能加点
#            skillManager.LVUpSkillBySkillTypeID(skillTypeID)
#            DataRecordPack.DR_LearnORUPSkill(curPlayer, skillTypeID, learnSkillLV)
#
#            # 是被动技能要重刷属性
#            #if SkillCommon.isPassiveBuffSkill(learnSkillData):
#            #    BuffSkill.AddBuffNoRefreshState(curPlayer, buffType, learnSkillData, tick, [], curPlayer)
#            #    isRefreshAttr = True
#
#            isAddSkill = True
#
#            addPointDict[skillTypeID] = addPoint + 1
#            skillTypeLVDict[skillTypeID] = learnSkillLV
#            seriesTotalPointDict[curSeriesType] = seriesTotalPointDict.get(curSeriesType, 0) + 1
#            allSeriesTotalPoint += 1
#            SetGreatMasterFreeSkillPoint(curPlayer, freeSkillPoint - 1)
#            # 成就
#            #successKey = ChConfig.Def_PDict_Success_CntValue%(ShareDefine.SuccType_TalentPoint, 0)
#            #curSuccess = PlayerSuccess.GetPDictValue(curPlayer, successKey)
#            #if curSuccess < allSeriesTotalPoint:
#            #    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_TalentPoint, 1)
#
#            #GameWorld.DebugLog("    加天赋技能 learnSkillID=%s,skillTypeID=%s,skillLV=%s,doCnt=%s,needCnt=%s"
#            #                   % (learnSkillID, skillTypeID, learnSkillLV, addPoint + 1, totalAddPoint))
#
#        #GameWorld.DebugLog("    isAddSkill=%s" % isAddSkill)
#
#    if isRefreshAttr:
#        curControl = PlayerControl.PlayerControl(curPlayer)
#        #curControl.CalcPassiveBuffAttr()
#        curControl.RefreshPlayerAttrByBuff()
#
#    PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_224510")
#    Sync_GreatMasterFreeSkillPoint(curPlayer)
#    return
#// A5 50 重置大师天赋技能 #tagCMResetMasterSkill
@@ -502,57 +281,49 @@
#  @return: None
def OnResetMasterSkill(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    ResetMasterSkillCost = ReadChConfig.GetEvalChConfig("ResetMasterSkillCost")
    needItemID = IpyGameDataPY.GetFuncCfg('TalentResetBook')
    costMoney = IpyGameDataPY.GetFuncCfg('TalentResetBook', 2)
    moneyType = IPY_GameWorld.TYPE_Price_Gold_Money
    if not PlayerControl.HaveMoney(curPlayer, moneyType, ResetMasterSkillCost):
        return
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(needItemID, itemPack, 1)
    if not hasEnough:
        #道具不足,扣钱
        if not PlayerControl.HaveMoney(curPlayer, moneyType, costMoney):
            return
    
    if not DoResetMasterSkillPoint(curPlayer):
        return
    # 扣除消耗
    PlayerControl.PayMoney(curPlayer, moneyType, ResetMasterSkillCost, ChConfig.Def_Cost_ResetGreatMasterSkill)
    if hasEnough:
        ItemCommon.ReduceItem(curPlayer, itemPack, itemList, 1, False)
    else:
        PlayerControl.PayMoney(curPlayer, moneyType, costMoney, ChConfig.Def_Cost_ResetGreatMasterSkill)
    return
## 重置大师天赋技能
#  @param curPlayer
#  @return: 是否成功
def DoResetMasterSkillPoint(curPlayer):
    greatMasterSkillDict = ReadChConfig.GetEvalChConfig("GreatMasterSkill")
    jobType = ChConfig.JOB_TYPE_DICT[curPlayer.GetJob()]
    if jobType not in greatMasterSkillDict:
        return False
    jobMasterSkillDict = greatMasterSkillDict[jobType] # 本职业天赋系对应技能
    freeSkillPoint = GetGreatMasterFreeSkillPoint(curPlayer)
    resetPoint = 0
    
    skillManager = curPlayer.GetSkillManager()
    
    isRefreshAttr = False
    # 汇总天赋技能所属天赋系
    for skillTypeIDList in jobMasterSkillDict.values():
    for i in range(0, skillManager.GetSkillCount()):
        skill = skillManager.GetSkillByIndex(i)
        if skill == None:
            continue
        skillTypeID = skill.GetSkillTypeID()
        if not IpyGameDataPY.GetIpyGameDataNotLog('TalentSkill', skillTypeID):
            continue
        curSkillLV = skill.GetSkillLV()
        # 被动技能刷属性
        if SkillCommon.isPassiveSkill(skill):
            isRefreshAttr = True
        
        for skillTypeID in skillTypeIDList:
            curSkill = skillManager.FindSkillBySkillTypeID(skillTypeID)
            if not curSkill:
                continue
            curSkillLV = curSkill.GetSkillLV()
            # 被动技能刷属性
            if SkillCommon.isPassiveSkill(curSkill):
                isRefreshAttr = True
            resetPoint += curSkillLV
            skillManager.DeleteSkillBySkillTypeID(skillTypeID)
        resetPoint += curSkillLV
        skillManager.DeleteSkillBySkillTypeID(skillTypeID)
            
    if resetPoint <= 0:
        GameWorld.DebugLog("不需要重置技能天赋!")