| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Player.PlayerPrestigeSys  | 
| #  | 
| # @todo:¾ôλϵͳ/ÉÙÄê¾³½ç  | 
| # @author hxp  | 
| # @date 2017-7-21  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ¾ôλϵͳ/ÉÙÄê¾³½ç  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2017-10-10 14:30"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import ItemCommon  | 
| import GameFuncComm  | 
| import PlayerControl  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import IPY_GameWorld  | 
| import IpyGameDataPY  | 
| import ShareDefine  | 
| import GameWorld  | 
| import ChConfig  | 
| import PlayerSuccess  | 
| import ChEquip  | 
| import PlayerBillboard  | 
| import PlayerTongTianLing  | 
| import PassiveBuffEffMng  | 
| import PlayerGubao  | 
| import EventShell  | 
| import DataRecordPack  | 
| import SkillCommon  | 
| import PlayerTask  | 
| import FBCommon  | 
|   | 
| import time  | 
| #------------------------------------------------------------------------------  | 
|   | 
| # ¶É½ÙÌõ¼þ¼Ç¼λ¶¨Òå  | 
| (  | 
| RealmLVUpAward_LV, # µÈ¼¶  | 
| RealmLVUpAward_PassMap, # ¹ý¹Ø¹Ø¿¨  | 
| RealmLVUpAward_TreeLV, # ÏÉÊ÷µÈ¼¶  | 
| RealmLVUpAward_CutTreeCnt, # ¿³Ê÷´ÎÊý  | 
| ) = range(4)  | 
|   | 
| def DoOfficialOpen(curPlayer):  | 
|     #¹¦ÄÜ¿ªÆô  | 
| #    curRealmLV = curPlayer.GetOfficialRank()  | 
| #    if not curRealmLV:  | 
| #        DoRealmLVUpLogic(curPlayer)  | 
|     return True  | 
|   | 
|   | 
| def OnLogin(curPlayer):  | 
|     SyncRealmFBState(curPlayer)  | 
|     UpdateRealmExp(curPlayer, False)  | 
|     NotifyRealmExpInfo(curPlayer)  | 
|     return  | 
|   | 
|   | 
| def GetRealmIpyData(realmLV): return IpyGameDataPY.GetIpyGameData("Realm", realmLV)  | 
|   | 
|   | 
| #// A5 24 ¿ªÆô¶É½Ù #tagCMOpenRealmFB  | 
| #  | 
| #struct    tagCMOpenRealmFB  | 
| #{  | 
| #    tagHead        Head;  | 
| #};  | 
| def OpenRealmFB(index, clientData, tick):  | 
|     return  | 
|   | 
| def GetXXZLAward(curPlayer, taskID):  | 
|     ## ÁìÈ¡ÐÞÏÉ֮·½±Àø  | 
|     awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmXXZLAward)  | 
|     if awardState&pow(2, taskID):  | 
|         GameWorld.DebugLog("ÒÑÁìÈ¡¹ý¾³½çÐÞÏÉ֮·¸Ã½±Àø, taskID=%s" % taskID, curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     ipyData = IpyGameDataPY.GetIpyGameData("RealmXXZL", taskID)  | 
|     if not ipyData:  | 
|         return  | 
|     taskType = ipyData.GetTaskType()  | 
|     needValue = ipyData.GetNeedValue()  | 
|     curValue= 0  | 
|       | 
|     #1. µÃµ½ XXX·¨±¦£¬ ËùÐèֵΪ·¨±¦ID  | 
|     if taskType == 1:  | 
|         magicWeaponID = needValue  | 
|         if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponLV % magicWeaponID) >= 1:  | 
|             curValue = needValue  | 
|               | 
|     #2. Í¨¹ØÌìÐÇËþX²ã  | 
|     elif taskType == 2:  | 
|         curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerFloor)  | 
|       | 
|     #3. »÷ɱÊÀ½çBOSSXÖ»  | 
|     elif taskType == 3:  | 
|         curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntTotal % ShareDefine.Def_Boss_Func_World)  | 
|           | 
|     #4. »îÔ¾ÐÞÁ¶X´Î  | 
|     elif taskType == 4:  | 
|         curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityCountTotal)  | 
|                   | 
|     #5. »÷ɱ¸öÈËBOSS£ºxxx£¬ËùÐè֮Ϊ¸öÈËboss±í¶ÔÓ¦Ïß·id  | 
|     elif taskType == 5:  | 
|         mapID = ChConfig.Def_FBMapID_PersonalBoss  | 
|         lineID = needValue  | 
|         if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID]):  | 
|             curValue = needValue  | 
|               | 
|     #6. Í¨¹Ø×ÚÃÅÊÔÁ¶x´Î  | 
|     elif taskType == 6:  | 
|         curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntTotal % ChConfig.Def_FBMapID_MunekadoTrial)  | 
|           | 
|     #7. »ñµÃXµãÁé¸ùµã  | 
|     elif taskType == 7:  | 
|         curValue = PlayerControl.GetTotalLingGenPoint(curPlayer)  | 
|           | 
|     if curValue < needValue:  | 
|         GameWorld.DebugLog("¾³½çÐÞÏÉ֮·µ±Ç°ÈÎÎñËùÐèÖµ²»Âú×㣬ÎÞ·¨Áì½±, taskID=%s,taskType=%s,curValue=%s < %s"   | 
|                            % (taskID, taskType, curValue, needValue), curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     awardItemList = ipyData.GetAwardItemList()  | 
|     if not ItemCommon.GiveAwardItem(curPlayer, awardItemList):  | 
|         return  | 
|       | 
|     updAwardState = awardState|pow(2, taskID)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmXXZLAward, updAwardState)  | 
|     GameWorld.DebugLog("ÁìÈ¡¾³½çÐÞÏÉ֮·½±Àø, awardID=%s,updAwardState=%s" % (taskID, updAwardState), curPlayer.GetPlayerID())  | 
|     SyncRealmFBState(curPlayer)  | 
|     return  | 
|   | 
| def SyncRealmFBState(curPlayer):  | 
|     #֪ͨ¿Í»§¶Ë¶É½Ù¸±±¾ÊÇ·ñ¿ªÆô  | 
|     #if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Official):  | 
|     #    return  | 
|     sendPack = ChPyNetSendPack.tagMCSyncRealmInfo()  | 
|     sendPack.IsPass = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen)  | 
|     sendPack.XXZLAwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmXXZLAward)  | 
|     sendPack.RealmLVUpAwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmLVUpAwardState)  | 
|     sendPack.RealmLVUpCutTreeCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmLVUpCutTreeCnt)  | 
|     NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
|     return  | 
|   | 
|   | 
| ## ¼ÆËã¾ôλÊôÐÔ  | 
| #  @param curPlayer Íæ¼Ò  | 
| #  @param allAttrList ÊôÐÔÁÐ±í  | 
| #  @return None  | 
| def CalcOfficialRankAttr(curPlayer):  | 
|     if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Official):  | 
|         return  | 
|   | 
|     curRealmLV = curPlayer.GetOfficialRank()  | 
|     realmIpyData = GetRealmIpyData(curRealmLV)  | 
|     if not realmIpyData:  | 
|         return  | 
|      | 
|     addAttrIDList, addAttrValueList = realmIpyData.GetAddAttrType(), realmIpyData.GetAddAttrNum()  | 
|       | 
|     allAttrList = [{} for i in range(4)]  | 
|     for i, attrID in enumerate(addAttrIDList):  | 
|         PlayerControl.CalcAttrDict_Type(attrID, addAttrValueList[i], allAttrList)  | 
|           | 
|     # ±£´æ¼ÆËãÖµ  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Prestige, allAttrList)  | 
|     return  | 
|   | 
|   | 
| ## ÖØË¢ËùÓÐÊôÐÔ  | 
| #  @param curPlayer  | 
| #  @param isForceRefresh:Ç¿ÖÆË¢ÐÂÅÅÐаñ  | 
| #  @return Ö¸¶¨Êý¾Ý  | 
| def RefreshOfficialAttr(curPlayer):  | 
|     CalcOfficialRankAttr(curPlayer)  | 
|     PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()  | 
|     return  | 
|   | 
| def AddRealmLVUpCutTreeCnt(curPlayer, addCnt):  | 
|     curRealmLV = curPlayer.GetOfficialRank()  | 
|     realmIpyData = GetRealmIpyData(curRealmLV)  | 
|     if not realmIpyData:  | 
|         return  | 
|     NeedCutTreeCnt = realmIpyData.GetNeedCutTreeCnt()  | 
|     if not NeedCutTreeCnt:  | 
|         return  | 
|     curTreeCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmLVUpCutTreeCnt)  | 
|     if curTreeCnt >= NeedCutTreeCnt:  | 
|         return  | 
|     updCutTreeCnt = min(curTreeCnt + addCnt, NeedCutTreeCnt)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmLVUpCutTreeCnt, updCutTreeCnt)  | 
|     SyncRealmFBState(curPlayer)  | 
|     return  | 
|   | 
| def GetRealmLVUpTaskAward(curPlayer, awardIndex):  | 
|     ## ÁìÈ¡¾³½ç¶É½ÙÈÎÎñÌõ¼þ½±Àø  | 
|     awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmLVUpAwardState)  | 
|     if awardState&pow(2, awardIndex):  | 
|         GameWorld.DebugLog("¾³½ç¶É½ÙÌõ¼þÁì½±£¬ÒÑÁìÈ¡¹ý! awardIndex=%s" % awardIndex, curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     curRealmLV = curPlayer.GetOfficialRank()  | 
|     realmIpyData = GetRealmIpyData(curRealmLV)  | 
|     if not realmIpyData:  | 
|         return  | 
|       | 
|     awardItemInfo = None  | 
|     if awardIndex == RealmLVUpAward_LV:  | 
|         playerLV = curPlayer.GetLV()  | 
|         NeedLV = realmIpyData.GetNeedLV()  | 
|         if playerLV < NeedLV:  | 
|             GameWorld.DebugLog('¾³½ç¶É½ÙÌõ¼þÁì½±£¬µÈ¼¶²»×ã! curRealmLV=%s,playerLV=%s < %s' % (curRealmLV, playerLV, NeedLV))  | 
|             return  | 
|         awardItemInfo = realmIpyData.GetLVAwardItem()  | 
|           | 
|     elif awardIndex == RealmLVUpAward_PassMap:  | 
|         NeedPassMap = realmIpyData.GetNeedPassMap()  | 
|         if not NeedPassMap or len(NeedPassMap) != 2:  | 
|             return  | 
|         mapID, lineID = NeedPassMap  | 
|         if not FBCommon.IsFBPass(curPlayer, mapID, lineID):  | 
|             GameWorld.DebugLog('¾³½ç¶É½ÙÌõ¼þÁì½±£¬¸±±¾Î´¹ý¹Ø! curRealmLV=%s,mapID=%s,lineID=%s' % (curRealmLV, mapID, lineID))  | 
|             return  | 
|         awardItemInfo = realmIpyData.GetPassMapAwardItem()  | 
|           | 
|     elif awardIndex == RealmLVUpAward_TreeLV:  | 
|         NeedTreeLV = realmIpyData.GetNeedTreeLV()  | 
|         if not NeedTreeLV:  | 
|             return  | 
|         treeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV)  | 
|         if treeLV < NeedTreeLV:  | 
|             GameWorld.DebugLog('¾³½ç¶É½ÙÌõ¼þÁì½±£¬ÏÉÊ÷µÈ¼¶²»×ã! curRealmLV=%s,treeLV=%s < %s' % (curRealmLV, treeLV, NeedTreeLV))  | 
|             return  | 
|         awardItemInfo = realmIpyData.GetTreeLVAwardItem()  | 
|           | 
|     elif awardIndex == RealmLVUpAward_CutTreeCnt:  | 
|         NeedCutTreeCnt = realmIpyData.GetNeedCutTreeCnt()  | 
|         if not NeedCutTreeCnt:  | 
|             return  | 
|         cutTreeCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmLVUpCutTreeCnt)  | 
|         if cutTreeCnt < NeedCutTreeCnt:  | 
|             GameWorld.DebugLog('¾³½ç¶É½ÙÌõ¼þÁì½±£¬¿³Ê÷´ÎÊý²»×ã! curRealmLV=%s,cutTreeCnt=%s < %s' % (curRealmLV, cutTreeCnt, NeedCutTreeCnt))  | 
|             return  | 
|         awardItemInfo = realmIpyData.GetCutTreeAwardItem()  | 
|           | 
|     else:  | 
|         return  | 
|       | 
|     if not awardItemInfo or len(awardItemInfo) != 2:  | 
|         return  | 
|     itemID, itemCount = awardItemInfo  | 
|     if not ItemCommon.GiveAwardItem(curPlayer, [[itemID, itemCount, 0]]):  | 
|         return  | 
|       | 
|     updAwardState = awardState|pow(2, awardIndex)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmLVUpAwardState, updAwardState)  | 
|     GameWorld.DebugLog("¾³½ç¶É½ÙÌõ¼þÁì½±OK! curRealmLV=%s,awardIndex=%s,updAwardState=%s" % (curRealmLV, awardIndex, updAwardState), curPlayer.GetPlayerID())  | 
|     SyncRealmFBState(curPlayer)  | 
|     return  | 
|   | 
| #// A5 23 ÌáÉý¾³½çµÈ¼¶ # tagCMRealmLVUp  | 
| #  | 
| #struct    tagCMRealmLVUp  | 
| #{  | 
| #    tagHead        Head;  | 
| #};  | 
| def DoRealmLVUp(index, clientData, tick):  | 
|     #Éý¼¶¾³½ç  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     curRealmLV = curPlayer.GetOfficialRank()  | 
|     realmIpyData = GetRealmIpyData(curRealmLV)  | 
|     if not realmIpyData:  | 
|         GameWorld.ErrLog("ûÓиþ³½çµÈ¼¶Êý¾Ý! Lv=%s" % curRealmLV)  | 
|         return  | 
|     if realmIpyData.GetBossID():  | 
|         canLvUp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen) == 1  | 
|         if not canLvUp:  | 
|             GameWorld.DebugLog('    ¸±±¾Î´¹ý¹Ø£¬²»ÄÜÉý¼¶¾³½ç')  | 
|             return  | 
|           | 
|     awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmLVUpAwardState)  | 
|     #µÈ¼¶ÅжϠ- ±ØÒªÌõ¼þ  | 
|     playerLV = curPlayer.GetLV()  | 
|     if not awardState&pow(2, RealmLVUpAward_LV):  | 
|         GameWorld.DebugLog('µÈ¼¶Ìõ¼þ½±ÀøÎ´ÁìÈ¡£¬²»ÄÜÉý¼¶¾³½ç! curRealmLV=%s' % (curRealmLV))  | 
|         return  | 
|     totalExpNeed = PlayerControl.GetTotalExpByPlayerLv(playerLV)  | 
|     totalExp = PlayerControl.GetPlayerTotalExp(curPlayer)  | 
|     if totalExp < totalExpNeed:  | 
|         GameWorld.DebugLog('µÈ¼¶Ìõ¼þ¾ÑéδÂú£¬²»ÄÜÉý¼¶¾³½ç! curRealmLV=%s,playerLV=%s,totalExp=%s < %s' % (curRealmLV, playerLV, totalExp, totalExpNeed))  | 
|         return  | 
|       | 
|     #¸±±¾¹ý¹ØÅÐ¶Ï  | 
|     NeedPassMap = realmIpyData.GetNeedPassMap()  | 
|     if NeedPassMap:  | 
|         if not awardState&pow(2, RealmLVUpAward_PassMap):  | 
|             GameWorld.DebugLog('¹ý¹ØÌõ¼þ½±ÀøÎ´ÁìÈ¡£¬²»ÄÜÉý¼¶¾³½ç! curRealmLV=%s' % (curRealmLV))  | 
|             return  | 
|           | 
|     #ÏÉÊ÷µÈ¼¶ÅÐ¶Ï  | 
|     NeedTreeLV = realmIpyData.GetNeedTreeLV()  | 
|     if NeedTreeLV:  | 
|         if not awardState&pow(2, RealmLVUpAward_TreeLV):  | 
|             GameWorld.DebugLog('ÏÉÊ÷µÈ¼¶Ìõ¼þ½±ÀøÎ´ÁìÈ¡£¬²»ÄÜÉý¼¶¾³½ç! curRealmLV=%s' % (curRealmLV))  | 
|             return  | 
|           | 
|     #¿³Ê÷´ÎÊýÅÐ¶Ï  | 
|     NeedCutTreeCnt = realmIpyData.GetNeedCutTreeCnt()  | 
|     if NeedCutTreeCnt:  | 
|         if not awardState&pow(2, RealmLVUpAward_CutTreeCnt):  | 
|             GameWorld.DebugLog('¿³Ê÷´ÎÊýÌõ¼þ½±ÀøÎ´ÁìÈ¡£¬²»ÄÜÉý¼¶¾³½ç! curRealmLV=%s' % (curRealmLV))  | 
|             return  | 
|           | 
|     DoRealmLVUpLogic(curPlayer)  | 
|     return  | 
|   | 
| # ÌáÉý1¼¶¾³½ç¼Óµã  | 
| def __DoRealmLVUpAddPoint(curPlayer):  | 
|     if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_AddPoint):  | 
|         # Î´¿ªÆôǰ²»¿É¼Óµã£¬ÒòΪDoAddPointOpen»áÒ»´ÎÐÔ²¹Æë£¬±ÜÃâÒâÍâÇé¿ö¶à¼ÓÁ˵ãÊý  | 
|         return  | 
|   | 
|     curFreePoint = curPlayer.GetFreePoint()  | 
|     addPoint = IpyGameDataPY.GetFuncCfg("LVUPAddPoint", 3)  | 
|     if addPoint != 0:  | 
|         setFreePoint = curFreePoint + addPoint  | 
|         DataRecordPack.DR_Freepoint(curPlayer, "RealmLVUp", addPoint)  | 
|         curPlayer.SetFreePoint(setFreePoint)  | 
|   | 
|     return  | 
|   | 
|   | 
| def DoRealmLVUpLogic(curPlayer, needSys=True):  | 
|     curRealmLV = curPlayer.GetOfficialRank()  | 
|     nextRealmLv = curRealmLV + 1  | 
|     GameWorld.DebugLog('    Éý¼¶¾³½çnextRealmLv=%s' % nextRealmLv)  | 
|     nextRealmIpyData = GetRealmIpyData(nextRealmLv)  | 
|     if not nextRealmIpyData:  | 
|         return  | 
|       | 
|     curPlayer.SetOfficialRank(nextRealmLv)  | 
|     # ÌáÉý1¼¶¾³½ç¼Óµã  | 
|     __DoRealmLVUpAddPoint(curPlayer)  | 
|     PlayerGubao.DoGubaoAddFreePoint(curPlayer)  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmLVUpAwardState, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmLVUpCutTreeCnt, 0)  | 
|       | 
|     PlayerControl.PlayerControl(curPlayer).PlayerLvUp()  | 
|       | 
|     if needSys:  | 
|         addBuffID = nextRealmIpyData.GetBuffID()  | 
|         if addBuffID:  | 
|             PlayerControl.WorldNotify(0, 'BigRealmUpSuccess', [curPlayer.GetName(), curPlayer.GetID(), nextRealmLv, IpyGameDataPY.GetFuncCfg('RadioExpRealm')])  | 
|             msgStr = str(addBuffID)  | 
|             GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'RealmUpAddBuff', msgStr, len(msgStr))  | 
|         else:  | 
|             PlayerControl.WorldNotify(0, 'RealmUpSuccess', [curPlayer.GetName(), curPlayer.GetID(), nextRealmLv])  | 
|               | 
|     if SkillCommon.GivePlayerSkillByJobSkill(curPlayer, nextRealmIpyData.GetLearnSkillIDInfo()):  | 
|         PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEffSet(curPlayer)  | 
|           | 
|     addFreePoint = nextRealmIpyData.GetAddFreePoint()  | 
|     if addFreePoint:  | 
|         updFreePoint = curPlayer.GetFreePoint() + addFreePoint  | 
|         curPlayer.SetFreePoint(updFreePoint)  | 
|         GameWorld.DebugLog("    addFreePoint=%s,updFreePoint=%s" % (addFreePoint, updFreePoint))  | 
|           | 
|     RefreshOfficialAttr(curPlayer)  | 
|     GameFuncComm.DoFuncOpenLogic(curPlayer)  | 
|     SyncRealmFBState(curPlayer)  | 
|     #¸üÐÂÐÞΪËÙÂÊ  | 
|     UpdateRealmExp(curPlayer, False, True)  | 
|     NotifyRealmExpInfo(curPlayer)  | 
|     #¾³½çÌáÉý³É¾Í  | 
|     PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_RealmlvUp, nextRealmLv)  | 
|     PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_RealmUp, 1)  | 
|     #¸üÐÂÅÅÐаñ  | 
|     PlayerBillboard.UpdateRealmBillboard(curPlayer)  | 
|     # ¼Ç¼¿ª·þ»î¶¯  | 
|     #OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_RealmLV, nextRealmLv)  | 
|     EventShell.EventRespons_RealmUp(curPlayer, nextRealmLv)  | 
|     PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_RealmLV)  | 
|     #Á÷Ïò  | 
|     DataRecordPack.DR_RealmLVUp(curPlayer, nextRealmLv)  | 
|     return True  | 
|   | 
|   | 
| def DologicDujieFBPass(curPlayer, realmLV, star):  | 
|     #¶É½Ùͨ¹ýºó´¦Àí  | 
|     realmIpyData = GetRealmIpyData(realmLV)  | 
|     if not realmIpyData:  | 
|         return  | 
|     #DoRealmLVUpLogic(curPlayer)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 1)  | 
|     SyncRealmFBState(curPlayer)  | 
|       | 
|     return  | 
|   | 
|   | 
| #// A5 21 ¾³½çÐÞΪ³ØÌáÈ¡ #tagCMTakeOutRealmExp  | 
| #  | 
| #struct    tagCMTakeOutRealmExp  | 
| #{  | 
| #    tagHead        Head;  | 
| #};  | 
| def OnTakeOutRealmExp(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     playerID = curPlayer.GetID()  | 
|     curTotalRealmExp = UpdateRealmExp(curPlayer, False)  | 
|     if curTotalRealmExp <= 0:  | 
|         GameWorld.DebugLog('¾³½çÐÞΪ³ØÌáÈ¡ Ã»ÓоÑé¿ÉÌáÈ¡', playerID)  | 
|         return  | 
|     playerControl = PlayerControl.PlayerControl(curPlayer)  | 
|     playerControl.AddExp(curTotalRealmExp)  | 
|     PlayerControl.NotifyCode(curPlayer, 'TakeOutRealmExp', [curTotalRealmExp])  | 
|     #  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpBeginTime, int(time.time()))  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExp, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpPoint, 0)  | 
|   | 
|     NotifyRealmExpInfo(curPlayer)  | 
|     return  | 
|   | 
|   | 
| def UpdateRealmExp(curPlayer, isNotify=True, isRealmLVUP=False):  | 
|     ##¸üо³½çÐÞΪ³Ø  | 
|     curRealmLV = curPlayer.GetOfficialRank()  | 
|     ipyData = GetRealmIpyData(curRealmLV)  | 
|     if not ipyData:  | 
|         return 0  | 
|     if not ipyData.GetExpRate():  | 
|         return 0  | 
|     curTime = int(time.time())  | 
|     beginTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpBeginTime)  | 
|     if not beginTime:  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpBeginTime, curTime)  | 
|         return 0  | 
|     if isRealmLVUP:  | 
|         ipyData = GetRealmIpyData(curRealmLV-1)  | 
|               | 
|     curRealmExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExp)  | 
|     curRealmExpPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpPoint)  | 
|     curTotalExp = curRealmExpPoint * ChConfig.Def_PerPointValue + curRealmExp  | 
|     if curTotalExp >= ipyData.GetExpLimit():  | 
|         return curTotalExp  | 
|       | 
|     passSeconds = curTime - beginTime  | 
|     if passSeconds <= 0:  | 
|         return curTotalExp  | 
|     perRealmExpTime = IpyGameDataPY.GetFuncCfg('RealmExpTime')  | 
|     curExpRate = ipyData.GetExpRate()  | 
|     #buffÔö¼ÓµÄ¶îÍâ¾Ñé  | 
|     buffRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpBuffRemainTime)  | 
|     buffAddRate = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpBuffAddRate)  | 
|       | 
|     buffTime = min(buffRemainTime, passSeconds)  | 
|       | 
|     addExp = buffTime /perRealmExpTime*(curExpRate*(ShareDefine.Def_MaxRateValue + buffAddRate)/ShareDefine.Def_MaxRateValue) + (passSeconds-buffTime)/perRealmExpTime*curExpRate  | 
|     #addExp = passSeconds / perRealmExpTime * curExpRate  | 
|     if addExp <= 0:  | 
|         return curTotalExp  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpBeginTime, curTime)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpBuffRemainTime, buffRemainTime - buffTime)  | 
|       | 
|     updTotalExp = min(curTotalExp + addExp, ipyData.GetExpLimit())  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExp, updTotalExp % ChConfig.Def_PerPointValue)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpPoint, updTotalExp / ChConfig.Def_PerPointValue)  | 
|     #֪ͨ  | 
|     if isNotify:  | 
|         NotifyRealmExpInfo(curPlayer)  | 
|     return updTotalExp  | 
|   | 
| def AddRealmExpBuffTime(curPlayer, addTime, addRate):  | 
|     ##Ôö¼Ó»áÁ鵤BUFFʱ¼ä  | 
|     UpdateRealmExp(curPlayer, False)  | 
|       | 
|     remainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpBuffRemainTime)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpBuffRemainTime, remainTime + addTime)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpBuffAddRate, addRate)  | 
|     NotifyRealmExpInfo(curPlayer)  | 
|     return  | 
|   | 
| def NotifyRealmExpInfo(curPlayer):  | 
|     ##֪ͨÐÞΪ³ØÐÅÏ¢  | 
|     sendPack = ChPyNetSendPack.tagMCRealmExpInfo()  | 
|     sendPack.BeginTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpBeginTime)  | 
|     sendPack.BuffTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpBuffRemainTime)  | 
|     sendPack.BuffAddRate = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpBuffAddRate)  | 
|     sendPack.CurExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExp)  | 
|     sendPack.CurExpPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpPoint)  | 
|     NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
|     return  | 
|   |