#!/usr/bin/python 
 | 
# -*- coding: GBK -*- 
 | 
#------------------------------------------------------------------------------- 
 | 
# 
 | 
##@package Player.PlayerShentong 
 | 
# 
 | 
# @todo:Éñͨ 
 | 
# @author hxp 
 | 
# @date 2023-01-08 
 | 
# @version 1.0 
 | 
# 
 | 
# ÏêϸÃèÊö: Éñͨ 
 | 
# 
 | 
#------------------------------------------------------------------------------- 
 | 
#"""Version = 2023-01-08 18:00""" 
 | 
#------------------------------------------------------------------------------- 
 | 
  
 | 
import GameWorld 
 | 
import ShareDefine 
 | 
import PlayerControl 
 | 
import IpyGameDataPY 
 | 
import ChPyNetSendPack 
 | 
import IPY_GameWorld 
 | 
import NetPackCommon 
 | 
import PlayerGubao 
 | 
import ItemCommon 
 | 
import ChConfig 
 | 
import SkillCommon 
 | 
  
 | 
def GetShentongLVInfo(curPlayer, shentongID): 
 | 
    lvInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShentongLVInfo % shentongID) 
 | 
    classLV = lvInfo / 100 
 | 
    lv = lvInfo % 100 
 | 
    return classLV, lv 
 | 
def SetShentongLVInfo(curPlayer, shentongID, classLV, lv): 
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShentongLVInfo % shentongID, classLV * 100 + lv) 
 | 
    return 
 | 
  
 | 
def OnPlayerLogin(curPlayer): 
 | 
    Sync_ShentongLVInfo(curPlayer) 
 | 
    Sync_ShentongSkillInfo(curPlayer, True) 
 | 
    return 
 | 
  
 | 
#// B2 19 ÉñͨÉý¼¶ #tagCMShentongLVUp 
 | 
# 
 | 
#struct    tagCMShentongLVUp 
 | 
#{ 
 | 
#    tagHead         Head; 
 | 
#    BYTE        ShentongID;     
 | 
#}; 
 | 
def OnShentongLVUp(index, curPackData, tick): 
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) 
 | 
    playerID = curPlayer.GetPlayerID() 
 | 
    shentongID = curPackData.ShentongID 
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("Shentong", shentongID) 
 | 
    if not ipyData: 
 | 
        return 
 | 
    needGubaoID = ipyData.GetNeedGubaoID() 
 | 
    if needGubaoID and not PlayerGubao.GetGubaoLVInfo(curPlayer, needGubaoID)[1]: 
 | 
        GameWorld.DebugLog("¹Å±¦Î´¼¤»î£¬ÎÞ·¨Éý¼¶Éñͨ! shentongID=%s,needGubaoID=%s" % (shentongID, needGubaoID), playerID) 
 | 
        return 
 | 
     
 | 
    classLV, lv = GetShentongLVInfo(curPlayer, shentongID) 
 | 
    nextClassLV = classLV 
 | 
    nextLV = lv + 1 
 | 
    lvIpyData = IpyGameDataPY.GetIpyGameDataNotLog("ShentongLV", shentongID, nextClassLV, nextLV) 
 | 
    if not lvIpyData: 
 | 
        nextClassLV = classLV + 1 
 | 
        nextLV = 1 
 | 
        lvIpyData = IpyGameDataPY.GetIpyGameDataNotLog("ShentongLV", shentongID, nextClassLV, nextLV) 
 | 
    if not lvIpyData: 
 | 
        GameWorld.ErrLog("ûÓÐÏÂÒ»¼¶ÉñͨÊý¾Ý£¬ÎÞ·¨Éý¼¶! shentongID=%s,classLV=%s,lv=%s" % (shentongID, classLV, lv), playerID) 
 | 
        return 
 | 
     
 | 
    needItemList = lvIpyData.GetLVLightNeedItem() 
 | 
    if not needItemList: 
 | 
        return 
 | 
     
 | 
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) 
 | 
    lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack) 
 | 
    if lackItemDict: 
 | 
        GameWorld.DebugLog("ÉñͨÉý¼¶ËùÐèÎïÆ·²»×㣡 shentongID=%s,classLV(%s-%s),nextClassLV=(%s-%s),needItemList=%s,lackItemDict=%s"  
 | 
                           % (shentongID, classLV, lv, nextClassLV, nextLV, needItemList, lackItemDict), playerID) 
 | 
        return 
 | 
    #¿ÛÏûºÄ 
 | 
    ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Shentong") 
 | 
     
 | 
    SetShentongLVInfo(curPlayer, shentongID, nextClassLV, nextLV) 
 | 
    Sync_ShentongLVInfo(curPlayer, [shentongID]) 
 | 
     
 | 
    LVSkillID = lvIpyData.GetLVSkillID() 
 | 
    GameWorld.Log("ÉñͨÉý¼¶³É¹¦£¡ shentongID=%s,classLV(%s-%s),nextClassLV=(%s-%s),LVSkillID=%s"  
 | 
                  % (shentongID, classLV, lv, nextClassLV, nextLV, LVSkillID), playerID) 
 | 
    if LVSkillID: 
 | 
        lvSkillData = GameWorld.GetGameData().GetSkillBySkillID(LVSkillID) 
 | 
        lvSkillTypeID = lvSkillData.GetSkillTypeID() if lvSkillData else 0 
 | 
        lvSkillLV = lvSkillData.GetSkillLV() if lvSkillData else 0 
 | 
         
 | 
        ShentongSkillCount = len(IpyGameDataPY.GetFuncEvalCfg("Shentong", 1)) 
 | 
        skillIDList = [] 
 | 
        for num in range(ShentongSkillCount): 
 | 
            skillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShentongSkillID % num) 
 | 
            if not skillID: 
 | 
                skillIDList.append(0) 
 | 
                continue 
 | 
            skillData = GameWorld.GetGameData().GetSkillBySkillID(skillID) 
 | 
            if not skillData: 
 | 
                continue 
 | 
            skillTypeID = skillData.GetSkillTypeID() 
 | 
            skillLV = skillData.GetSkillLV() 
 | 
            if lvSkillTypeID == skillTypeID: 
 | 
                if lvSkillLV > skillLV: # Éý¼¶ 
 | 
                    skillIDList.append(LVSkillID) 
 | 
                else: 
 | 
                    skillIDList.append(0) # Ò»°ã²»¿ÉÄÜ£¬³öÏÖ¸ÃÇé¿öµÄ»°ÖÃ0ÖØÐÂÌí¼Ó 
 | 
            else: 
 | 
                skillIDList.append(skillID) 
 | 
                 
 | 
        # ÓпÕλĬÈÏÌí¼Óµ½¸Ã¿Õλ 
 | 
        if LVSkillID not in skillIDList and 0 in skillIDList: 
 | 
            skillIDList[skillIDList.index(0)] = LVSkillID 
 | 
             
 | 
        if LVSkillID in skillIDList: 
 | 
            GameWorld.DebugLog("×Ô¶¯³öÕ½/Ìæ»»Éñͨ¼¼ÄÜ: skillIDList=%s" % skillIDList, playerID) 
 | 
            SetShentongSkill(curPlayer, skillIDList) 
 | 
             
 | 
    RefreshShentongAttr(curPlayer) 
 | 
    return 
 | 
  
 | 
#// B2 20 Éñͨ¼¼ÄÜÉèÖà#tagCMShentongSkillSet 
 | 
# 
 | 
#struct    tagCMShentongSkillSet 
 | 
#{ 
 | 
#    tagHead         Head; 
 | 
#    BYTE        Count; 
 | 
#    DWORD        SkillIDList[Count]; 
 | 
#}; 
 | 
def OnShentongSkillSet(index, curPackData, tick): 
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) 
 | 
    skillIDList = curPackData.SkillIDList 
 | 
    SetShentongSkill(curPlayer, skillIDList) 
 | 
    return 
 | 
  
 | 
def SetShentongSkill(curPlayer, setSkillIDList): 
 | 
    # @param setSkillIDList: ÒòΪÊÇ·¢ËÍËùÓм¼ÄܲÛÉèÖõļ¼ÄÜ£¬ËùÒÔÔªËØÖпÉÄÜ´æÔÚ¼¼ÄÜ0 
 | 
    if not setSkillIDList: 
 | 
        return 
 | 
    needSkillCntList = IpyGameDataPY.GetFuncEvalCfg("Shentong", 1) 
 | 
    ShentongSkillCountMax = len(needSkillCntList) 
 | 
    if len(setSkillIDList) > ShentongSkillCountMax: 
 | 
        return 
 | 
     
 | 
    if len(setSkillIDList) < ShentongSkillCountMax: 
 | 
        setSkillIDList += [0] * (ShentongSkillCountMax - len(setSkillIDList)) 
 | 
         
 | 
    forbidSkillIDList = [] 
 | 
    for skillID in setSkillIDList: 
 | 
        if not skillID: 
 | 
            continue 
 | 
        if not GameWorld.GetGameData().GetSkillBySkillID(skillID): 
 | 
            GameWorld.ErrLog("ÕÒ²»µ½¸ÃÉñͨ¼¼ÄÜÊý¾Ý! skillID=%s" % skillID) 
 | 
            return 
 | 
        forbidSkillIDList.append(skillID) 
 | 
     
 | 
    setSkillCount = len(forbidSkillIDList) 
 | 
    canUseSkillDict = {} # {skillTypeID:skillID, ...} 
 | 
    ipyDataMgr = IpyGameDataPY.IPY_Data() 
 | 
    for index in xrange(ipyDataMgr.GetShentongLVCount()): 
 | 
        ipyData = ipyDataMgr.GetShentongLVByIndex(index) 
 | 
        LVSkillID = ipyData.GetLVSkillID() 
 | 
        if not LVSkillID: 
 | 
            continue 
 | 
        shentongID = ipyData.GetShentongID() 
 | 
        shentongClassLV = ipyData.GetShentongClassLV() 
 | 
        shentongLV = ipyData.GetShentongLV() 
 | 
        classLV, lv = GetShentongLVInfo(curPlayer, shentongID) 
 | 
        if classLV < shentongClassLV or (classLV == shentongClassLV and lv < shentongLV): 
 | 
            #GameWorld.ErrLog("ÉñͨµÈ¼¶²»×㣬ÎÞ·¨Ê¹Óøü¼ÄÜ! LVSkillID=%s,shentongID=%s,needClassLV=(%s-%s),curClassLV=(%s-%s)"  
 | 
            #                 % (LVSkillID, shentongID, shentongClassLV, shentongLV, classLV, lv), curPlayer.GetPlayerID()) 
 | 
            continue 
 | 
        skillData = GameWorld.GetGameData().GetSkillBySkillID(LVSkillID) 
 | 
        if not skillData: 
 | 
            continue 
 | 
        skillTypeID = skillData.GetSkillTypeID() 
 | 
        canUseSkillDict[skillTypeID] = LVSkillID 
 | 
        if LVSkillID in forbidSkillIDList: 
 | 
            forbidSkillIDList.remove(LVSkillID) 
 | 
             
 | 
    if forbidSkillIDList: 
 | 
        GameWorld.ErrLog("´æÔÚÎÞ·¨Ê¹ÓõÄÉñͨ¼¼ÄÜ£¬ÎÞ·¨ÉèÖÃ! setSkillIDList=%s,forbidSkillIDList=%s"  
 | 
                         % (setSkillIDList, forbidSkillIDList), curPlayer.GetPlayerID()) 
 | 
        return 
 | 
     
 | 
    if setSkillCount > 0: 
 | 
        needCanUseSkillCnt = needSkillCntList[setSkillCount - 1] 
 | 
        if needCanUseSkillCnt > len(canUseSkillDict): 
 | 
            GameWorld.DebugLog("´æÔÚδ½âËøµÄÉñͨ¼¼Äܿף¬ÎÞ·¨ÉèÖÃ! setSkillIDList=%s,needCanUseSkillCnt=%s > canUseSkillCnt=%s(%s)"  
 | 
                               % (setSkillIDList, needCanUseSkillCnt, len(canUseSkillDict), canUseSkillDict), curPlayer.GetPlayerID()) 
 | 
            return 
 | 
         
 | 
    # ÒòΪ¿ÉÄܵ÷Õû˳Ðò£¬±ØÐëÏÈͳһɾ³ýÔÙͳһÌí¼Ó£¬²»È»¿ÉÄܵ¼Ö¼¼ÄÜ˳Ðòµ÷ÕûºóÏȱ»Ìí¼ÓºóÓÖ±»É¾³ý 
 | 
    skillManager = curPlayer.GetSkillManager() 
 | 
    playerCtl = PlayerControl.PlayerControl(curPlayer) 
 | 
    for num in range(ShentongSkillCountMax): 
 | 
        skillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShentongSkillID % num) 
 | 
        if skillID and skillManager.FindSkillBySkillID(skillID): 
 | 
            skillManager.DeleteSkillBySkillID(skillID, True) 
 | 
            playerCtl.RefreshSkillFightPowerByDel(skillID) 
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShentongSkillID % num, 0) 
 | 
         
 | 
    tick = GameWorld.GetGameWorld().GetTick() 
 | 
    for num in range(ShentongSkillCountMax): 
 | 
        setSkillID = setSkillIDList[num]  
 | 
        if setSkillID: 
 | 
            skillManager.LearnSkillByID(setSkillID, True) 
 | 
            playerCtl.RefreshSkillFightPowerEx(setSkillID, 0) 
 | 
            # ÖØÐÂÉèÖü¼ÄÜÇ¿ÖÆ½øÈëCD 
 | 
            curSkill = skillManager.FindSkillBySkillID(setSkillID) 
 | 
            if curSkill: 
 | 
                SkillCommon.SetSkillRemainTime(curSkill, PlayerControl.GetReduceSkillCDPer(curPlayer), tick, curPlayer, True) 
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShentongSkillID % num, setSkillID)         
 | 
         
 | 
    Sync_ShentongSkillInfo(curPlayer) 
 | 
    return 
 | 
  
 | 
def RefreshShentongAttr(curPlayer): 
 | 
    CalcShentongAttr(curPlayer) 
 | 
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState() 
 | 
    return 
 | 
  
 | 
def CalcShentongAttr(curPlayer): 
 | 
     
 | 
    customAttrDictShentong = {} 
 | 
    fightPowerEx = 0 
 | 
    allAttrList = [{} for _ in range(4)] 
 | 
     
 | 
    shentongSkillInfo = {} 
 | 
    ipyDataMgr = IpyGameDataPY.IPY_Data() 
 | 
    for index in xrange(ipyDataMgr.GetShentongCount()): 
 | 
        ipyData = ipyDataMgr.GetShentongByIndex(index) 
 | 
        shentongID = ipyData.GetShentongID() 
 | 
        classLV, lv = GetShentongLVInfo(curPlayer, shentongID) 
 | 
        if not classLV and not lv: 
 | 
            continue 
 | 
        lvIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("ShentongLV", {"ShentongID":shentongID}, True) 
 | 
        if not lvIpyDataList: 
 | 
            continue 
 | 
        for lvIpyData in lvIpyDataList: 
 | 
            shentongClassLV = lvIpyData.GetShentongClassLV() 
 | 
            shentongLV = lvIpyData.GetShentongLV() 
 | 
            if classLV < shentongClassLV or (classLV == shentongClassLV and lv < shentongLV): 
 | 
                break 
 | 
             
 | 
            LVAttrTypeList = lvIpyData.GetLVAttrTypeList() 
 | 
            LVAttrValueList = lvIpyData.GetLVAttrValueList() 
 | 
            for i, attrID in enumerate(LVAttrTypeList): 
 | 
                attrValue = LVAttrValueList[i] 
 | 
                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList) 
 | 
                 
 | 
            if lvIpyData.GetFightPowerEx(): 
 | 
                fightPowerEx += lvIpyData.GetFightPowerEx() 
 | 
                 
 | 
            LVSkillID = lvIpyData.GetLVSkillID() 
 | 
            if LVSkillID: 
 | 
                skillData = GameWorld.GetGameData().GetSkillBySkillID(LVSkillID) 
 | 
                if skillData: 
 | 
                    skillTypeID = skillData.GetSkillTypeID() 
 | 
                    skillLV = skillData.GetSkillLV() 
 | 
                    shentongSkillInfo[skillTypeID] = skillLV 
 | 
                     
 | 
    customAttrDictShentong["shentongSkillInfo"] = shentongSkillInfo           
 | 
    # ¸½¼ÓÕ½Á¦ 
 | 
    curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Shentong, fightPowerEx) 
 | 
    # ±£´æ¼ÆËãÖµ 
 | 
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Shentong, allAttrList, customAttrDict=customAttrDictShentong) 
 | 
    return 
 | 
  
 | 
def Sync_ShentongLVInfo(curPlayer, shentongIDList=None): 
 | 
    if shentongIDList == None: 
 | 
        syncIDList = [] 
 | 
        ipyDataMgr = IpyGameDataPY.IPY_Data() 
 | 
        for index in range(ipyDataMgr.GetShentongCount()): 
 | 
            ipyData = ipyDataMgr.GetShentongByIndex(index) 
 | 
            syncIDList.append(ipyData.GetShentongID()) 
 | 
    else: 
 | 
        syncIDList = shentongIDList 
 | 
         
 | 
    shentongInfoList = [] 
 | 
    for shentongID in syncIDList: 
 | 
        classLV, lv = GetShentongLVInfo(curPlayer, shentongID) 
 | 
        if not classLV and not lv and shentongIDList == None: 
 | 
            # Ã»ÓÐÖ¸¶¨Ê±Ö»Í¬²½¼¤»îµÄ 
 | 
            continue 
 | 
        shentong = ChPyNetSendPack.tagMCShentongLV() 
 | 
        shentong.ShentongID = shentongID 
 | 
        shentong.ClassLV = classLV 
 | 
        shentong.LV = lv 
 | 
        shentongInfoList.append(shentong) 
 | 
         
 | 
    if not shentongInfoList: 
 | 
        return 
 | 
     
 | 
    clientPack = ChPyNetSendPack.tagMCShentongLVInfo() 
 | 
    clientPack.ShentongLVList = shentongInfoList 
 | 
    clientPack.Count = len(clientPack.ShentongLVList) 
 | 
    NetPackCommon.SendFakePack(curPlayer, clientPack) 
 | 
    return 
 | 
  
 | 
def Sync_ShentongSkillInfo(curPlayer, isLogin=False): 
 | 
    skillIDList = [] 
 | 
    ShentongSkillCountMax = len(IpyGameDataPY.GetFuncEvalCfg("Shentong", 1)) 
 | 
    for num in range(ShentongSkillCountMax): 
 | 
        skillIDList.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShentongSkillID % num)) 
 | 
         
 | 
    if skillIDList.count(0) == ShentongSkillCountMax and isLogin: 
 | 
        return 
 | 
     
 | 
    clientPack = ChPyNetSendPack.tagMCShentongSkillInfo() 
 | 
    clientPack.SkillIDList = skillIDList 
 | 
    clientPack.Count = len(clientPack.SkillIDList) 
 | 
    NetPackCommon.SendFakePack(curPlayer, clientPack) 
 | 
    return 
 |