#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package Player.PlayerGreatMaster  
 | 
#  
 | 
# @todo:Ì츳ϵͳ  
 | 
# @author xdh  
 | 
# @date 2018-9-26  
 | 
# @version 1.0  
 | 
#  
 | 
#  
 | 
# ÏêϸÃèÊö: Ì츳ϵͳ  
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
#"""Version = 2018-9-26 20:00"""  
 | 
  
 | 
import GameWorld  
 | 
import PlayerControl  
 | 
import IPY_GameWorld  
 | 
import DataRecordPack  
 | 
import SkillCommon  
 | 
import ShareDefine  
 | 
import ChConfig  
 | 
import GameFuncComm  
 | 
import IpyGameDataPY  
 | 
import ItemCommon  
 | 
import PassiveBuffEffMng  
 | 
  
 | 
## ´óʦ¹¦ÄÜÊÇ·ñ¿ªÆô  
 | 
#  @param curPlayer  
 | 
#  @return  
 | 
def IsGreatMasterOpen(curPlayer):  
 | 
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Talent):  
 | 
        return False  
 | 
    return True  
 | 
  
 | 
def DoTalentOpen(curPlayer):  
 | 
    '''Ì츳¹¦ÄÜ¿ªÆô´¦ÀíÌ츳µã '''  
 | 
    curLV = curPlayer.GetLV()  
 | 
    openLV = GameFuncComm.GetFuncLimitLV(ShareDefine.GameFuncID_Talent)  
 | 
    setTalentPoint = 0  
 | 
    for lv in xrange(openLV, curLV+1):  
 | 
        lvIpyData = PlayerControl.GetPlayerLVIpyData(lv)  
 | 
        addTalentPoint = lvIpyData.GetTalentPoint() if lvIpyData else 0  
 | 
        setTalentPoint += addTalentPoint  
 | 
    curFreeSkillPoint = GetGreatMasterFreeSkillPoint(curPlayer)  
 | 
    if setTalentPoint != curFreeSkillPoint:  
 | 
        SetGreatMasterFreeSkillPoint(curPlayer, setTalentPoint)  
 | 
        Sync_GreatMasterFreeSkillPoint(curPlayer)  
 | 
        GameWorld.Log('    Ì츳¹¦ÄÜ¿ªÆô´¦ÀíÌ츳µã beforeTalentPoint=%s,setTalentPoint=%s, curLV=%s'%(curFreeSkillPoint, setTalentPoint, curLV), curPlayer.GetID())  
 | 
    return  
 | 
  
 | 
## µÇ¼´¦Àí  
 | 
#  @param curPlayer  
 | 
#  @return  
 | 
def MasterOnLogin(curPlayer):  
 | 
    if not IsGreatMasterOpen(curPlayer):  
 | 
        return  
 | 
      
 | 
    Sync_GreatMasterFreeSkillPoint(curPlayer)  
 | 
    return  
 | 
  
 | 
  
 | 
## Ôö¼Ó´óʦÌ츳µã  
 | 
#  @param curPlayer  
 | 
#  @return  
 | 
def AddGreatMasterSkillPointByLV(curPlayer, addPoint):  
 | 
    if not addPoint:  
 | 
        return  
 | 
    curFreeSkillPoint = GetGreatMasterFreeSkillPoint(curPlayer)  
 | 
    GameWorld.DebugLog("´óʦÌ츳µã£¡curFreeSkillPoint = %s"%curFreeSkillPoint)  
 | 
    SetGreatMasterFreeSkillPoint(curPlayer, curFreeSkillPoint + addPoint)  
 | 
    Sync_GreatMasterFreeSkillPoint(curPlayer)  
 | 
    return  
 | 
  
 | 
  
 | 
## »ñÈ¡µ±Ç°Ê£Óà´óʦ¼¼ÄÜµã  
 | 
def GetGreatMasterFreeSkillPoint(curPlayer):  
 | 
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Master_FreeSkillPoint, 0, ChConfig.Def_PDictType_GreatMaster)  
 | 
  
 | 
## ÉèÖõ±Ç°Ê£Óà´óʦ¼¼ÄÜµã  
 | 
def SetGreatMasterFreeSkillPoint(curPlayer, value):  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Master_FreeSkillPoint, value, ChConfig.Def_PDictType_GreatMaster)  
 | 
    return  
 | 
  
 | 
  
 | 
## Í¬²½´óʦʣÓàÌ츳µã  
 | 
#  @param curPlayer  
 | 
#  @return   
 | 
def Sync_GreatMasterFreeSkillPoint(curPlayer):  
 | 
    curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_TalentPoint, GetGreatMasterFreeSkillPoint(curPlayer), False)  
 | 
    return  
 | 
  
 | 
  
 | 
#// A5 49 ´óʦÌ츳¼¼Äܼӵã #tagCMAddMasterSkillPoint  
 | 
#  
 | 
#struct    tagCMMasterSkillPoint  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    DWORD        SkillID;        // Ì츳¼¼ÄÜID  
 | 
#    BYTE        AddPoint;        // ¼ÓµÄµãÊý  
 | 
#};  
 | 
#  
 | 
#struct    tagCMAddMasterSkillPoint  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    BYTE        SkillCnt;        // ±ä¸ü¼¼ÄܸöÊý  
 | 
#    tagCMMasterSkillPoint        AddSkillPointList[SkillCnt];    // ¼ÓµÄ¼¼ÄܵãÊýÁÐ±í  
 | 
#};   
 | 
## ´óʦÌ츳¼¼ÄÜ¼Óµã  
 | 
#  @param index: Íæ¼ÒË÷Òý  
 | 
#  @param clientData: ·â°ü½á¹¹Ìå  
 | 
#  @param tick: Ê±¼ä´Á  
 | 
#  @return: None  
 | 
def OnAddMasterSkillPoint(index, clientData, tick):  
 | 
    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)     
 | 
#              
 | 
#            # ÊDZ»¶¯¼¼ÄÜÒªÖØË¢ÊôÐÔ  
 | 
#            #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  
 | 
#  
 | 
#struct    tagCMResetMasterSkill  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#};   
 | 
## ÖØÖôóʦÌ츳¼¼ÄÜ  
 | 
#  @param index: Íæ¼ÒË÷Òý  
 | 
#  @param clientData: ·â°ü½á¹¹Ìå  
 | 
#  @param tick: Ê±¼ä´Á  
 | 
#  @return: None  
 | 
def OnResetMasterSkill(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    needItemID = IpyGameDataPY.GetFuncCfg('TalentResetBook')  
 | 
    costMoney = IpyGameDataPY.GetFuncCfg('TalentResetBook', 2)  
 | 
    moneyType = IPY_GameWorld.TYPE_Price_Gold_Money  
 | 
    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  
 | 
    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):  
 | 
    freeSkillPoint = GetGreatMasterFreeSkillPoint(curPlayer)  
 | 
    resetPoint = 0  
 | 
      
 | 
    skillManager = curPlayer.GetSkillManager()  
 | 
      
 | 
    isRefreshAttr = False  
 | 
    delCnt = 0  
 | 
    for i in range(0, skillManager.GetSkillCount()):  
 | 
        dataIndex = i-delCnt  
 | 
        skill = skillManager.GetSkillByIndex(dataIndex)  
 | 
        if skill == None:  
 | 
            continue  
 | 
        skillTypeID = skill.GetSkillTypeID()  
 | 
        if not IpyGameDataPY.GetIpyGameDataNotLog('TalentSkill', skillTypeID):  
 | 
            continue  
 | 
        curSkillLV = skill.GetSkillLV()  
 | 
        # ±»¶¯¼¼ÄÜË¢ÊôÐÔ  
 | 
        if SkillCommon.isPassiveSkill(skill):  
 | 
            isRefreshAttr = True  
 | 
          
 | 
        resetPoint += curSkillLV  
 | 
        skillManager.DeleteSkillBySkillTypeID(skillTypeID)  
 | 
        delCnt +=1  
 | 
              
 | 
    if resetPoint <= 0:  
 | 
        GameWorld.DebugLog("²»ÐèÒªÖØÖü¼ÄÜÌ츳£¡")  
 | 
        return False  
 | 
              
 | 
    SetGreatMasterFreeSkillPoint(curPlayer, freeSkillPoint + resetPoint)  
 | 
    Sync_GreatMasterFreeSkillPoint(curPlayer)  
 | 
      
 | 
    # ÖØÐÂˢб»¶¯¼¼ÄÜ  
 | 
    passiveEff = PassiveBuffEffMng.GetPassiveEffManager().InitObjPassiveEff(curPlayer)  
 | 
    passiveEff.RefreshPassiveSkill()  
 | 
    DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_ResetTalent, {'resetPoint':resetPoint})  
 | 
    if isRefreshAttr:  
 | 
        # ÖØË¢±»¶¯¼¼ÄÜ  
 | 
        PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer)  
 | 
    # ÖØË¢¼¼ÄÜÕ½Á¦  
 | 
    curControl = PlayerControl.PlayerControl(curPlayer)  
 | 
    curControl.RefreshAllSkill()  
 | 
    curControl.RefreshPlayerAttrState()  
 | 
    return True  
 | 
  
 |