#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#  
 | 
#  
 | 
##@package PlayerDienstgrad.py  
 | 
#  
 | 
# @todo: Íæ¼Ò³ÆºÅ¹ÜÀí  
 | 
# @author: alee  
 | 
# @date: 2017-07-26 22£º00  
 | 
# @version 1.0  
 | 
# ÏêϸÃèÊö:  
 | 
# @change: 2017-10-18 21:00 alee ²ß»®ÐèÇóÈ¥³ýµãÁÁ³ÆºÅÂß¼  
 | 
#------------------------------------------------------------------------------   
 | 
"""Version = 2017-07-26 22£º00"""  
 | 
#------------------------------------------------------------------------------   
 | 
  
 | 
#µ¼Èë  
 | 
import GameWorld  
 | 
import PlayerControl  
 | 
import IPY_GameWorld  
 | 
import ChConfig  
 | 
import ReadChConfig  
 | 
import IpyGameDataPY  
 | 
import SkillCommon  
 | 
import SkillShell  
 | 
import PassiveBuffEffMng  
 | 
import DataRecordPack  
 | 
import CrossPlayerData  
 | 
import GameFuncComm  
 | 
import ShareDefine  
 | 
  
 | 
import time  
 | 
#-------------------------------------------------------------  
 | 
#####ͨ¹ýPlayer¶ÔÏó½Ó¿Ú#####  
 | 
  
 | 
  
 | 
## ²éÕÒÍæ¼ÒÖ¸¶¨³ÆºÅ  
 | 
#  @param curPlayer  
 | 
#  @param dienstgradID ³ÆºÅID  
 | 
#  @return ³ÆºÅʵÀý  
 | 
def PlayerGetDienstgrad(curPlayer, dienstgradID):      
 | 
    if curPlayer == None:  
 | 
        #Íæ¼Ò²»ÔÚÏß  
 | 
        return None  
 | 
    curDienstgradMgr = curPlayer.GetDienstgradManager()  
 | 
    curDienstgrad = curDienstgradMgr.GetDienstgrad(dienstgradID)  
 | 
    return curDienstgrad  
 | 
  
 | 
  
 | 
def GetDienstgradData(dienstgradID):  
 | 
    return IpyGameDataPY.GetIpyGameData('Dienstgrad', dienstgradID)  
 | 
  
 | 
def PlayerDelAddDienstgrad(curPlayer, delDienstgradIDList, addDienstgradIDList):  
 | 
    ## Íæ¼Òɾ³ý³ÆºÅµÄͬʱ£¬Ôö¼Ó³ÆºÅ£¬Ò»°ãÓÃÓڳƺŻ¥³âµÄÔöɾ±ä¸üͬ²½´¦Àí  
 | 
    if not delDienstgradIDList and not addDienstgradIDList:  
 | 
        return  
 | 
      
 | 
    isRefresh = False  
 | 
    for dienstgradID in delDienstgradIDList:  
 | 
        if PlayerDelDienstgrad(curPlayer, dienstgradID, isRefreshAttr=False):  
 | 
            isRefresh = True  
 | 
          
 | 
    for dienstgradID in addDienstgradIDList:  
 | 
        if PlayerAddDienstgrad(curPlayer, dienstgradID, isDelRepeat=False, isRefreshAttr=False):  
 | 
            isRefresh = True  
 | 
          
 | 
    #ÖØÐÂˢнÇÉ«ÊôÐÔ  
 | 
    if isRefresh:  
 | 
        CalcAllDienstgradAttr(curPlayer)  
 | 
        playerControl = PlayerControl.PlayerControl(curPlayer)  
 | 
        playerControl.RefreshPlayerAttrState()  
 | 
    return isRefresh  
 | 
  
 | 
## Ìí¼ÓÍæ¼Ò³ÆºÅ  
 | 
#  @param curPlayer  
 | 
#  @param dienstgradID ³ÆºÅID  
 | 
#  @param isDelRepeat ÊÇ·ñɾ³ýÖØ¸´³ÆºÅ  
 | 
#  @return ÊÇ·ñÌí¼Ó³É¹¦  
 | 
def PlayerAddDienstgrad(curPlayer, dienstgradID, isDelRepeat=True, isRefreshAttr=True, expireTime=0):  
 | 
  
 | 
    if dienstgradID <= 0:  
 | 
        return False  
 | 
      
 | 
    #²éϵͳ±íÊý¾Ý  
 | 
    curDienstgradData = GetDienstgradData(dienstgradID)  
 | 
    if curDienstgradData == None:  
 | 
        return False  
 | 
      
 | 
    curDienstgradMgr = curPlayer.GetDienstgradManager()  
 | 
      
 | 
    #curOldGradID = curDienstgradMgr.GetCurGradID()  
 | 
      
 | 
    #ÖØ¸´Ìí¼Ó³ÆºÅ, ÏÞʱµÄÐèҪɾ³ýÖØÉèË¢ÐÂʱ¼ä  
 | 
    curDienstgrad = curDienstgradMgr.GetDienstgrad(dienstgradID)  
 | 
    if curDienstgrad:  
 | 
        if isDelRepeat:  
 | 
            curDienstgradMgr.DeleteDienstgrad(dienstgradID)  
 | 
        else:  
 | 
            return True  
 | 
          
 | 
          
 | 
    #¼ì²é»¥³âµÄ³ÆºÅÀàÐÍ  
 | 
#    curType = curDienstgradData.GetType()  
 | 
#    ExcludeDienstgradType = ReadChConfig.GetEvalChConfig("ExcludeDienstgradType")  
 | 
#    if curType in ExcludeDienstgradType:  
 | 
#        #»¥³âµÄ³ÆºÅÀàÐÍ ÐèҪɾµôͬÀàÐͳƺŠ 
 | 
#        curTypeIDList = IpyGameDataPY.DienstgradData.GetTypeIDList(curType)  
 | 
#        for id in curTypeIDList:  
 | 
#            if id == dienstgradID:  
 | 
#                continue  
 | 
#            curDienstgrad = curDienstgradMgr.GetDienstgrad(id)  
 | 
#            if curDienstgrad == None:  
 | 
#                #Íæ¼Ò³ÆºÅ²»´æÔÚ  
 | 
#                continue  
 | 
#            #Èç¹ûµ±Ç°×°±¸³ÆºÅ±»É¾£¬ÐèÒª¹ã²¥  
 | 
#            if curOldGradID == id:  
 | 
#                PlayerTakeOffDienstgrad(curPlayer)  
 | 
#              
 | 
#            curDienstgradMgr.DeleteDienstgrad(id)  
 | 
#            #֪ͨ³ÆºÅɾ³ý  
 | 
#            curDienstgradMgr.Sync_PlayerDelDienstgrad(id)  
 | 
      
 | 
    #Ìí¼Ó³ÆºÅ  
 | 
    curDienstgrad = curDienstgradMgr.AddDienstgrad(dienstgradID)   
 | 
      
 | 
    if expireTime != 0:  
 | 
        curDienstgrad.SetExpireTime(expireTime)  
 | 
    curDienstgradMgr.Sync_PlayerGetDienstgrad(dienstgradID)  
 | 
      
 | 
    # Ñ§Ï°¼¼ÄÜ  
 | 
    skillList = curDienstgradData.GetSkills()  
 | 
  
 | 
    for skillID in skillList:  
 | 
        __GiveSkill(curPlayer, skillID)  
 | 
          
 | 
    CrossPlayerData.OnDienstgradChange(curPlayer, dienstgradID, 1)  
 | 
    if dienstgradID == IpyGameDataPY.GetFuncCfg("TitleAddPoint"):  
 | 
        __DoTitleAddPoint(curPlayer)  
 | 
    #ÖØÐÂˢнÇÉ«ÊôÐÔ  
 | 
    if isRefreshAttr:  
 | 
        CalcAllDienstgradAttr(curPlayer)  
 | 
        playerControl = PlayerControl.PlayerControl(curPlayer)  
 | 
        playerControl.RefreshPlayerAttrState()  
 | 
    return True  
 | 
  
 | 
  
 | 
# »ñµÃ³ÆºÅ¼Óµã  
 | 
def __DoTitleAddPoint(curPlayer):  
 | 
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_AddPoint):  
 | 
        # Î´¿ªÆôǰ²»¿É¼Óµã£¬ÒòΪDoAddPointOpen»áÒ»´ÎÐÔ²¹Æë£¬±ÜÃâÒâÍâÇé¿ö¶à¼ÓÁ˵ãÊý  
 | 
        return  
 | 
    addPointDict = IpyGameDataPY.GetFuncEvalCfg("LVUPAddPoint", 1, {})  
 | 
    titleAddPoint = PlayerControl.GetTitleAddExtraPoint(curPlayer)  
 | 
    if titleAddPoint <=0:  
 | 
        return  
 | 
    curLV = curPlayer.GetLV()  
 | 
    addFreePoint = 0  
 | 
    for rangLVs, point in addPointDict.items():  
 | 
        if curLV < rangLVs[0]:  
 | 
            continue  
 | 
        addFreePoint += titleAddPoint * (min(curLV, rangLVs[1]) - rangLVs[0] + 1)  
 | 
    freePoint = curPlayer.GetFreePoint()  
 | 
    updFreePoint = freePoint + addFreePoint  
 | 
    curPlayer.SetFreePoint(updFreePoint)  
 | 
    GameWorld.DebugLog("»ñµÃ³ÆºÅÔö¼Ó×ÔÓÉÊôÐÔµã: freePoint=%s,addFreePoint=%s,curLV=%s,updFreePoint=%s"   
 | 
                       % (freePoint, addFreePoint, curLV, updFreePoint))  
 | 
      
 | 
    return  
 | 
  
 | 
# ´Ó³ÆºÅ»ñµÃ¼¼ÄÜ  
 | 
def __GiveSkill(curPlayer, skillResID):  
 | 
      
 | 
    skillData = GameWorld.GetGameData().FindSkillByType(skillResID, 1)  
 | 
    if skillData == None:  
 | 
        GameWorld.DebugLog("__GiveSkill() hasn't find skill(%s)" % skillResID)  
 | 
        return  
 | 
    if not SkillCommon.CheckSkillJob(curPlayer, skillData):  
 | 
        return  
 | 
    if not SkillShell.CheckLearnSkillCondition(curPlayer, skillData):  
 | 
        GameWorld.DebugLog("__GiveSkill() learn skill(%s) condition isn't enough" % skillResID)  
 | 
        return  
 | 
    skillManager = curPlayer.GetSkillManager()  
 | 
    if skillManager.FindSkillBySkillTypeID(skillResID):  
 | 
        GameWorld.DebugLog("__GiveSkill() have learned skill(%s)" % skillResID)  
 | 
        return  
 | 
  
 | 
    skillManager.LVUpSkillBySkillTypeID(skillResID)  
 | 
      
 | 
    PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer, skillResID)      
 | 
      
 | 
    PlayerControl.PlayerControl(curPlayer).RefreshSkillFightPowerEx(skillResID, 0)  
 | 
    return  
 | 
  
 | 
  
 | 
# ³ÆºÅ¹ýÆÚɾ³ý¼¼ÄÜ  
 | 
def __DelSkill(curPlayer, curDienstgradData):  
 | 
    # Ñ§Ï°¼¼ÄÜ  
 | 
    skillList = curDienstgradData.GetSkills()  
 | 
    isDel = False  
 | 
    for skillResID in skillList:  
 | 
        skillManager = curPlayer.GetSkillManager()  
 | 
        if not skillManager.FindSkillBySkillTypeID(skillResID):  
 | 
            continue  
 | 
      
 | 
        skillManager.DeleteSkillBySkillTypeID(skillResID)  
 | 
        isDel = True  
 | 
          
 | 
    if not isDel:  
 | 
        return  
 | 
      
 | 
    # ÖØË¢±»¶¯¼¼ÄÜ  
 | 
    PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer)      
 | 
    # ÖØË¢¼¼ÄÜÕ½Á¦  
 | 
    PlayerControl.PlayerControl(curPlayer).RefreshAllSkill()  
 | 
    return  
 | 
  
 | 
## É¾³ýÍæ¼Ò³ÆºÅ  
 | 
#  @param curPlayer  
 | 
#  @param dienstgradID ³ÆºÅID  
 | 
#  @return None  
 | 
def PlayerDelDienstgrad(curPlayer, dienstgradID, isRefreshAttr=True):  
 | 
    if curPlayer == None:  
 | 
        #Íæ¼Ò²»ÔÚÏß  
 | 
        return  
 | 
      
 | 
    if dienstgradID <= 0:  
 | 
        return  
 | 
      
 | 
    curDienstgradMgr = curPlayer.GetDienstgradManager()  
 | 
    curDienstgrad = curDienstgradMgr.GetDienstgrad(dienstgradID)  
 | 
    if curDienstgrad == None:  
 | 
        #Íæ¼Ò³ÆºÅ²»´æÔÚ  
 | 
        return  
 | 
      
 | 
    #Èç¹ûµ±Ç°×°±¸³ÆºÅ±»É¾£¬ÐèÒª¹ã²¥  
 | 
    if curDienstgradMgr.GetCurGradID() == dienstgradID:  
 | 
        PlayerTakeOffDienstgrad(curPlayer)  
 | 
          
 | 
    #===========================================================================  
 | 
    # if curDienstgradMgr.GetUseGradID() == dienstgradID:  
 | 
    #    UnUseDienstgrad(curPlayer)  
 | 
    #===========================================================================  
 | 
          
 | 
    curDienstgradMgr.DeleteDienstgrad(dienstgradID)  
 | 
    #֪ͨ³ÆºÅɾ³ý  
 | 
    curDienstgradMgr.Sync_PlayerDelDienstgrad(dienstgradID)  
 | 
      
 | 
    curDienstgradData = GetDienstgradData(dienstgradID)  
 | 
    if curDienstgradData:  
 | 
        # É¾³ý¶ÔÓ¦¼¼ÄÜ  
 | 
        __DelSkill(curPlayer, curDienstgradData)  
 | 
    DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_Title, {'dienstgradID':dienstgradID})  
 | 
      
 | 
    CrossPlayerData.OnDienstgradChange(curPlayer, dienstgradID, 0)  
 | 
    #ÖØÐÂˢнÇÉ«ÊôÐÔ  
 | 
    if isRefreshAttr:  
 | 
        CalcAllDienstgradAttr(curPlayer)  
 | 
        playerControl = PlayerControl.PlayerControl(curPlayer)  
 | 
        playerControl.RefreshPlayerAttrState()  
 | 
    return True  
 | 
  
 | 
## ´©×ÅÍæ¼Ò³ÆºÅ  
 | 
#  @param curPlayer  
 | 
#  @param dienstgradID ³ÆºÅID  
 | 
#  @return None     
 | 
def PlayerFitOnDienstgrad(curPlayer, dienstgradID):  
 | 
  
 | 
    curDienstgradMgr = curPlayer.GetDienstgradManager()  
 | 
    curDienstgrad = curDienstgradMgr.GetDienstgrad(dienstgradID)  
 | 
    if curDienstgrad == None:  
 | 
        #Íæ¼Ò³ÆºÅ²»´æÔÚ  
 | 
        return  
 | 
    curOldGradID = curDienstgradMgr.GetCurGradID()  
 | 
    if curOldGradID == dienstgradID:  
 | 
        #ÒÑ×°±¸¸Ã³ÆºÅ  
 | 
        return  
 | 
    curDienstgradMgr.SetCurGradID(dienstgradID)  
 | 
    curDienstgradMgr.Notify_PlayerChangeDienstgrad(dienstgradID)  
 | 
  
 | 
    return  
 | 
  
 | 
## Ð¶ÏÂÍæ¼Ò³ÆºÅ  
 | 
#  @param curPlayer  
 | 
#  @return None  
 | 
def PlayerTakeOffDienstgrad(curPlayer):  
 | 
  
 | 
    curDienstgradMgr = curPlayer.GetDienstgradManager()  
 | 
    curOldGradID = curDienstgradMgr.GetCurGradID()  
 | 
    if curOldGradID == 0:  
 | 
        return  
 | 
    curDienstgradMgr.SetCurGradID(0)  
 | 
    curDienstgradMgr.Notify_PlayerChangeDienstgrad(0)  
 | 
  
 | 
    return  
 | 
  
 | 
## ²»Ê¹Óã¨Åå´÷£©³ÆºÅ£¬ÓÃÓÚ¼¤»îÊôÐÔ£¬²»ÏÔʾ³¡¾°ÖÐ  
 | 
#  @param curPlayer  
 | 
#  @return None  
 | 
def UnUseDienstgrad(curPlayer):  
 | 
  
 | 
    curDienstgradMgr = curPlayer.GetDienstgradManager()  
 | 
    curOldGradID = curDienstgradMgr.GetUseGradID()  
 | 
    if curOldGradID == 0:  
 | 
        return False  
 | 
    curDienstgradMgr.SetUseGradID(0)  
 | 
  
 | 
    return True  
 | 
      
 | 
      
 | 
## Ê¹Óã¨Åå´÷£©³ÆºÅ£¬ÓÃÓÚ¼¤»îÊôÐÔ£¬ ²»ÏÔʾ³¡¾°ÖÐ  
 | 
#  @param curPlayer  
 | 
#  @param dienstgradID ³ÆºÅID  
 | 
#  @return None     
 | 
def UseDienstgrad(curPlayer, dienstgradID):  
 | 
  
 | 
    curDienstgradMgr = curPlayer.GetDienstgradManager()  
 | 
    curDienstgrad = curDienstgradMgr.GetDienstgrad(dienstgradID)  
 | 
    if curDienstgrad == None:  
 | 
        #Íæ¼Ò³ÆºÅ²»´æÔÚ  
 | 
        return False  
 | 
    curOldGradID = curDienstgradMgr.GetUseGradID()  
 | 
    if curOldGradID == dienstgradID:  
 | 
        #ÒÑ×°±¸¸Ã³ÆºÅ  
 | 
        return False  
 | 
    curDienstgradMgr.SetUseGradID(dienstgradID)  
 | 
  
 | 
    return True  
 | 
      
 | 
#-------------------------------------------------------------  
 | 
#####ͨ¹ýindexÍæ¼ÒË÷Òý½Ó¿Ú#####  
 | 
  
 | 
## ²éÕÒÍæ¼ÒÖ¸¶¨³ÆºÅ  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param dienstgradID ³ÆºÅID  
 | 
#  @return ³ÆºÅʵÀý  
 | 
def GetDienstgrad(index, dienstgradID):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    return PlayerGetDienstgrad(curPlayer, dienstgradID)  
 | 
  
 | 
## Ìí¼ÓÍæ¼Ò³ÆºÅ  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param dienstgradID ³ÆºÅID  
 | 
#  @return ÊÇ·ñÌí¼Ó³É¹¦  
 | 
def AddDienstgrad(index, dienstgradID):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    return PlayerAddDienstgrad(curPlayer, dienstgradID)   
 | 
  
 | 
## É¾³ýÍæ¼Ò³ÆºÅ  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param dienstgradID ³ÆºÅID  
 | 
#  @return None  
 | 
def DelDienstgrad(index, dienstgradID):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    PlayerDelDienstgrad(curPlayer, dienstgradID)  
 | 
      
 | 
      
 | 
## ´©×ÅÍæ¼Ò³ÆºÅ  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param dienstgradID ³ÆºÅID  
 | 
#  @return None     
 | 
def FitOnDienstgrad(index, dienstgradID):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    PlayerFitOnDienstgrad(curPlayer, dienstgradID)  
 | 
  
 | 
## Ð¶ÏÂÍæ¼Ò³ÆºÅ  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @return None  
 | 
def TakeOffDienstgrad(index):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    PlayerTakeOffDienstgrad(curPlayer)  
 | 
    return  
 | 
  
 | 
#-------------------------------------------------------------  
 | 
#####·â°ü´¦Àí#####  
 | 
  
 | 
##//03 35 Ö÷½ÇÍ·ÏÎË¢ÐÂ#tagCPlayerDienstgradRefresh  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick  
 | 
#  @return None        
 | 
def OnCPlayerDienstgradRefresh(index, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    if curPlayer == None:  
 | 
        #Íæ¼Ò²»ÔÚÏß  
 | 
        return  
 | 
    Sync_AllDienstgradOnLogin(curPlayer)  
 | 
    return  
 | 
  
 | 
def Sync_AllDienstgradOnLogin(curPlayer):  
 | 
    curDienstgradMgr = curPlayer.GetDienstgradManager()  
 | 
    curDienstgradMgr.Sync_AllDienstgrad()  
 | 
    curDienstgradMgr.Notify_PlayerChangeDienstgrad(curDienstgradMgr.GetCurGradID())  
 | 
  
 | 
#===============================================================================  
 | 
# //B2 01 Ê¹ÓóƺÅ(ÓÐÊôÐÔ²»ÏÔʾ³¡¾°ÖÐ) #tagPyCMUseDienstgrad  
 | 
#   
 | 
# struct    tagPyCMUseDienstgrad  
 | 
# {  
 | 
#    tagHead        Head;  
 | 
#    DWORD        GradID;        //Í·ÏÎID  
 | 
#    BYTE        State;        //ʹÓÃ״̬ 0È¡ÏûʹÓà1ʹÓàעÒâ0307°üΪ´©´÷³¡¾°ÖÐÏÔʾ  
 | 
# };  
 | 
#===============================================================================  
 | 
def UseDienstgradPack(index, clientData, tick):  
 | 
  
 | 
    #===========================================================================  
 | 
    # curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    # curGradID = clientData.GradID  
 | 
    # curGradState = clientData.State  
 | 
    #   
 | 
    # result = False  
 | 
    # if curGradID == 0:  
 | 
    #    result = UnUseDienstgrad(curPlayer)  
 | 
    # else:  
 | 
    #    if curGradState:  
 | 
    #        result = UseDienstgrad(curPlayer, curGradID)  
 | 
    #    else:  
 | 
    #        result = UnUseDienstgrad(curPlayer)  
 | 
    #          
 | 
    # if result:  
 | 
    #    CalcAllDienstgradAttr(curPlayer)  
 | 
    #    playerControl = PlayerControl.PlayerControl(curPlayer)  
 | 
    #    playerControl.RefreshPlayerAttrState()  
 | 
    #===========================================================================  
 | 
    return  
 | 
  
 | 
  
 | 
##//03 37 Ö÷½ÇװжͷÏÎ#tagCPlayerChangeDienstgrad  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick  
 | 
#  @return None      
 | 
def OnCPlayerChangeDienstgrad(index, tick):     
 | 
    sendPack = IPY_GameWorld.IPY_CPlayerChangeDienstgrad()  
 | 
    #//Í·ÏÎID  
 | 
    curGradID = sendPack.GetGradID()  
 | 
    #//×°±¸×´Ì¬ 0δװ±¸1ÒÑ×°±¸  
 | 
    curGradState = sendPack.GetState()  
 | 
      
 | 
    if curGradID == 0:  
 | 
        TakeOffDienstgrad(index)  
 | 
        return  
 | 
      
 | 
    if curGradState:  
 | 
        FitOnDienstgrad(index, curGradID)  
 | 
    else:  
 | 
        TakeOffDienstgrad(index)  
 | 
  
 | 
#-------------------------------------------------------------  
 | 
## »ñÈ¡ÒѼ¤»î³ÆºÅÁÐ±í  
 | 
#  @param curPlayer  
 | 
#  @return ³ÆºÅÁÐ±í  
 | 
def GetDienstgradActiveInfo(curPlayer):  
 | 
    titleActiveList = []  
 | 
    gradCnt = curPlayer.GetDienstgradManager().GetCount()  
 | 
    for i in xrange(gradCnt):  
 | 
        curGradID = curPlayer.GetDienstgradManager().AtGradID(i)  
 | 
        if curGradID == 0:  
 | 
            continue  
 | 
  
 | 
        titleActiveList.append(curGradID)  
 | 
    return titleActiveList  
 | 
  
 | 
def CalcAllDienstgradAttr(curPlayer):  
 | 
    # ¼ÆËãÈ«²¿³ÆºÅÊôÐÔ  
 | 
    allAttrList = [{} for i in range(4)]  
 | 
    dienstgradManager = curPlayer.GetDienstgradManager()  
 | 
    gradCnt = dienstgradManager.GetCount()  
 | 
    for i in xrange(gradCnt):  
 | 
        curGradID = dienstgradManager.AtGradID(i)  
 | 
        if curGradID == 0:  
 | 
            continue  
 | 
        curDienstgradData = GetDienstgradData(curGradID)  
 | 
        if curDienstgradData == None:  
 | 
            continue  
 | 
          
 | 
        attrTypeList = curDienstgradData.GetLightType()  
 | 
        attrValueList = curDienstgradData.GetLightAttribute()  
 | 
      
 | 
        for i, attrID in enumerate(attrTypeList):  
 | 
            PlayerControl.CalcAttrDict_Type(attrID, attrValueList[i], allAttrList)  
 | 
              
 | 
    # ±£´æ¼ÆËãÖµ  
 | 
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Dienstgrad, allAttrList)  
 | 
    return  
 | 
  
 | 
## ³ÆºÅÿÈÕ¸üд¦Àí  
 | 
#  @param curPlayer  
 | 
#  @return None  
 | 
def OnDay(curPlayer):  
 | 
    return  
 | 
  
 | 
##¼ì²é³ÆºÅ³¬Ê±  
 | 
#  @param curPlayer  
 | 
#  @return None  
 | 
def CheckDienstgradTimeout(curPlayer):  
 | 
    tick = int(time.time())  
 | 
    lastTick = curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_Dienstgrad)  
 | 
    if tick - lastTick < ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_Dienstgrad]:  
 | 
        return  
 | 
    curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_Dienstgrad, tick)  
 | 
      
 | 
    gradCnt = curPlayer.GetDienstgradManager().GetCount()  
 | 
    needClearList = []  
 | 
  
 | 
    #±éÀúËùÓгƺţ¬¼ì²é³¬Ê±  
 | 
    for i in xrange(gradCnt):  
 | 
        curGrad = curPlayer.GetDienstgradManager().At(i)  
 | 
        if not curGrad:  
 | 
            continue  
 | 
        curGradID = curGrad.GetGradID()  
 | 
        if curGradID == 0:  
 | 
            continue  
 | 
        curDienstgradData = GetDienstgradData(curGradID)  
 | 
        if curDienstgradData == None:  
 | 
            continue  
 | 
          
 | 
        curExpireTime = curGrad.GetExpireTime()     # ÌØÊâÖ¸¶¨ÓÐЧÆÚ  
 | 
        if not curExpireTime:  
 | 
            curExpireTime = curDienstgradData.GetExpireTime()  
 | 
            # 0´ú±í²»ÏÞʱ  
 | 
            if curExpireTime == 0:  
 | 
                continue  
 | 
          
 | 
        curCreateTime = curPlayer.GetDienstgradManager().AtCreateTime(i)  
 | 
        pastSeconds = GameWorld.GetPastSeconds(curCreateTime)  
 | 
        if pastSeconds < curExpireTime:  
 | 
            continue  
 | 
        needClearList.append(curGradID) #²»ÔÚ±éÀú¹ý³ÌÖÐɾ³ý£¬Ïȱ£´æÐèҪɾ³ýµÄ³ÆºÅ  
 | 
      
 | 
    #ÒÀ´Îɾ³ý³ÆºÅ  
 | 
    for curGradID in needClearList:  
 | 
        PlayerDelDienstgrad(curPlayer, curGradID)  
 | 
    return  
 | 
  
 | 
#-------------------ÌØÊâ´¦Àí³ÆºÅÂß¼-------------------  
 | 
  
 | 
##Íæ¼ÒµÚÒ»´ÎµÇ½¸ø³ÆºÅ  
 | 
#  @param curPlayer  
 | 
#  @return None  
 | 
def GiveFirstLoginDienstgrad(curPlayer):  
 | 
    dienstgradIDDict = ReadChConfig.GetEvalChConfig('FirstLogin_GiveDienstgrad')  
 | 
    platFormName = GameWorld.GetPlayerPlatform(curPlayer)  
 | 
    dienstgradIDList = dienstgradIDDict.get(platFormName)  
 | 
    if not dienstgradIDList: #δÅäÖÃµÄÆ½Ì¨Ä¬ÈÏÈ¡keyΪ0µÄÄÚÈÝ  
 | 
        dienstgradIDList = dienstgradIDDict.get(0, [])  
 | 
          
 | 
    for dienstgradID in dienstgradIDList:  
 | 
        PlayerAddDienstgrad(curPlayer, dienstgradID)  
 | 
        #PlayerFitOnDienstgrad(curPlayer, dienstgradID)  
 | 
    return 
 |