| #!/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 PlayerMagicWeapon  | 
| import PlayerSuccess  | 
| import OpenServerCampaign  | 
| import PlayerBillboard  | 
|   | 
| #------------------------------------------------------------------------------  | 
| (  | 
| StopSitType1, #ÀëÏßÖÐ¶Ï  | 
| StopSitType2, #Ö÷¶¯ÖÐ¶Ï  | 
| StopSitType3, #±»²É¼¯´ò¶Ï  | 
| )=range(1,4)  | 
|   | 
|   | 
| def DoOfficialOpen(curPlayer):  | 
|     #¹¦ÄÜ¿ªÆô  | 
| #    curRealmLV = curPlayer.GetOfficialRank()  | 
| #    if not curRealmLV:  | 
| #        DoRealmLVUpLogic(curPlayer)  | 
|     return True  | 
|   | 
| def OnLogin(curPlayer):  | 
|       | 
|     SyncRealmFBState(curPlayer)  | 
|     return  | 
|   | 
| def GetRealmIpyData(realmLV): return IpyGameDataPY.GetIpyGameData("Realm", realmLV)  | 
|   | 
| #// A5 24 ¿ªÆô¶É½Ù #tagCMOpenRealmFB  | 
| #  | 
| #struct    tagCMOpenRealmFB  | 
| #{  | 
| #    tagHead        Head;  | 
| #};  | 
| def OpenRealmFB(index, clientData, tick):  | 
|     return  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Official):  | 
|         GameWorld.DebugLog("¾ôλ¾³½ç¹¦ÄÜ먦Æô, ÎÞ·¨¿ªÆô¶É½Ù!curLV=%s" % curPlayer.GetLV())  | 
|         return  | 
|       | 
|     if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen):  | 
|         GameWorld.DebugLog("¶É½ÙÒÑ¿ªÆô£¬ÎÞ·¨ÔٴοªÆô£¡")  | 
|         return  | 
|       | 
|     curRealmLV = curPlayer.GetOfficialRank()  | 
|     realmIpyData = GetRealmIpyData(curRealmLV)  | 
|     if not realmIpyData:  | 
|         GameWorld.ErrLog("ûÓиþ³½çµÈ¼¶Êý¾Ý! Lv=%s" % curRealmLV)  | 
|         return  | 
|     needRealmPoint = realmIpyData.GetNeedPoint()  | 
|     if not needRealmPoint:  | 
|         GameWorld.DebugLog("¾³½çÒÑÊÇ×î´óµÈ¼¶£¬²»ÄÜÉý¼¶! Lv=%s" % curRealmLV, curPlayer.GetPlayerID())  | 
|         return  | 
|     if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_RealmPoint, needRealmPoint, False):  | 
|         GameWorld.DebugLog("¾³½çÐÞÁ¶µã²»×㣬ÎÞ·¨¿ªÆô¶É½Ù£¡needRealmPoint=%s" % (needRealmPoint), curPlayer.GetPlayerID())  | 
|         return  | 
|     needActiveTreasureDict = realmIpyData.GetNeedActiveTreasure()  | 
|     for mwType, needActiveCnt in needActiveTreasureDict.items():  | 
|         activeCnt = PlayerMagicWeapon.GetMWActiveCntByType(curPlayer, mwType)  | 
|         if activeCnt < needActiveCnt:  | 
|             GameWorld.DebugLog("¿ªÆô¶É½Ù ÐèÒª·¨±¦µÄ¼¤»îÌõ¼þ²»Âú×ã! needActiveTreasureDict=%s,·¨±¦ÀàÐÍ=%s, ÒѼ¤»îÊýÁ¿=%s" % (needActiveTreasureDict, mwType, activeCnt))  | 
|             return  | 
|       | 
|       | 
|     needItemID = realmIpyData.GetNeedItemID()  | 
|     needItemCount = realmIpyData.GetNeedItemCnt()  | 
|     # Ö§³Ö²»ÏûºÄÎïÆ·Éý¼¶  | 
|     if needItemID > 0 and needItemCount > 0:  | 
|         curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|         hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(needItemID, curPack, needItemCount)  | 
|         if not hasEnough:  | 
|             GameWorld.DebugLog("¶É½Ù¿ªÆô, ²ÄÁϲ»×ã! Lv=%s, needItemID=%s,needItemCount=%s"   | 
|                                % (curRealmLV, needItemID, needItemCount))  | 
|             return  | 
|         #¿Û³ýÎïÆ·  | 
|         ItemCommon.ReduceItem(curPlayer, curPack, itemIndexList, needItemCount, True, "Realm")  | 
|     PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_RealmPoint, needRealmPoint)  | 
|       | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 1)  | 
|     SyncRealmFBState(curPlayer)  | 
|     GameWorld.Log("¿ªÆô¶É½Ù¸±±¾³É¹¦: curRealmLV=%s" % curRealmLV, curPlayer.GetPlayerID())  | 
|     return  | 
|   | 
| def SyncRealmFBState(curPlayer):  | 
|     #֪ͨ¿Í»§¶Ë¶É½Ù¸±±¾ÊÇ·ñ¿ªÆô  | 
|     return  | 
|     if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Official):  | 
|         return  | 
|     sendPack = ChPyNetSendPack.tagMCSyncRealmFBIsOpen()  | 
|     sendPack.IsOpen = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen)  | 
|     sendPack.SitAllTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmSitAllTime)  | 
|     sendPack.SitRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmSitRemainTime)  | 
|     sendPack.SitStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmSitStartTime)  | 
|     #sendPack.LastEnterTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBLastEnterTime)  | 
|     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  | 
|   | 
| #// A5 23 ÌáÉý¾³½çµÈ¼¶ # tagCMRealmLVUp  | 
| #  | 
| #struct    tagCMRealmLVUp  | 
| #{  | 
| #    tagHead        Head;  | 
| #};  | 
| def DoRealmLVUp(index, clientData, tick):  | 
|     #Éý¼¶¾³½ç  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     canLvUp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen) == 2  | 
|     if not canLvUp:  | 
|         GameWorld.DebugLog('    ²»ÄÜÉý¼¶¾³½ç')  | 
|         return  | 
|       | 
|     DoRealmLVUpLogic(curPlayer)  | 
|     return  | 
|   | 
| def DoRealmLVUpLogic(curPlayer):  | 
|     curRealmLV = curPlayer.GetOfficialRank()  | 
|     nextRealmLv = curRealmLV + 1  | 
|     GameWorld.DebugLog('    Éý¼¶¾³½çnextRealmLv=%s'%nextRealmLv)  | 
|     nextRealmIpyData = GetRealmIpyData(nextRealmLv)  | 
|     if not nextRealmIpyData:  | 
|         return  | 
|       | 
|     curPlayer.SetOfficialRank(nextRealmLv)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 0)  | 
|       | 
|     #realmIpyData = GetRealmIpyData(curRealmLV)  | 
|     #if realmIpyData and realmIpyData.GetIsBigRealm():  | 
|     PlayerControl.WorldNotify(0, 'RealmUpSuccess', [curPlayer.GetName(), nextRealmLv])  | 
|     RefreshOfficialAttr(curPlayer)  | 
|     GameFuncComm.DoFuncOpenLogic(curPlayer)  | 
|     SyncRealmFBState(curPlayer)  | 
|     #¾³½çÌáÉý³É¾Í  | 
|     PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_RealmlvUp, nextRealmLv)  | 
|     #¸üÐÂÅÅÐаñ  | 
|     PlayerBillboard.UpdateRealmBillboard(curPlayer)  | 
|     # ¼Ç¼¿ª·þ»î¶¯  | 
|     OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_RealmLV, nextRealmLv)  | 
|     return True  | 
|   | 
| def DologicDujieFBPass(curPlayer, realmLV, star):  | 
|     #¶É½Ùͨ¹ýºó´¦Àí  | 
|     realmIpyData = GetRealmIpyData(realmLV)  | 
|     if not realmIpyData:  | 
|         return  | 
|     needRealmPoint = realmIpyData.GetNeedPoint()  | 
|     PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_RealmPoint, needRealmPoint)  | 
|     DoRealmLVUpLogic(curPlayer)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 0)  | 
|       | 
| #    sitTimeDict = realmIpyData.GetSitTime()  | 
| #    sitSecond = sitTimeDict.get(str(star), 0)  | 
| #    if sitSecond == 0:  | 
| #        #ûÓдò×øÊ±¼ä£¬Ö±½ÓÉý¾³½ç  | 
| #        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 2)  | 
| #    else:  | 
| #        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmSitAllTime, sitSecond)  | 
| #        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmSitRemainTime, sitSecond)  | 
| #    SyncRealmFBState(curPlayer)  | 
|       | 
|       | 
|     return  | 
|   | 
|   | 
|   | 
| #// A5 0C Ê¹ÓõÀ¾ß¼õÉٶɽٴò×øÊ±¼ä #tagCMReduceSitTime  | 
| #  | 
| #struct tagCMReduceSitTime  | 
| #{  | 
| #    tagHead        Head;  | 
| #    WORD        ItemCnt;       // µÀ¾ßÊýÁ¿  | 
| #};  | 
| def OnReduceSitTime(index, clientData, tick):  | 
| #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
| #    itemCnt = clientData.ItemCnt  | 
| #    reduceSitTimeItemID = IpyGameDataPY.GetFuncCfg('ReduceSitTimeItemID')  | 
| #      | 
| #    remainTime = __GetRemainSitTime(curPlayer)  | 
| #    if remainTime <= 0:  | 
| #        GameWorld.DebugLog('ʹÓõÀ¾ß¼õÉٶɽٴò×øÊ±¼ä remainTime=%s' % remainTime)  | 
| #        return  | 
| #    curItem = GameWorld.GetGameData().GetItemByTypeID(reduceSitTimeItemID)  | 
| #    curEff = curItem.GetEffectByIndex(0)  | 
| #    singleReduceTime = curEff.GetEffectValue(0)  | 
| #    useCnt = min(itemCnt, remainTime/singleReduceTime)  | 
| #    if not useCnt:  | 
| #        GameWorld.DebugLog('ʹÓõÀ¾ß¼õÉٶɽٴò×øÊ±¼ä useCnt=%s' % useCnt)  | 
| #        return  | 
| #      | 
| #    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
| #    hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(reduceSitTimeItemID, itemPack, useCnt)  | 
| #    if not hasEnough:  | 
| #        GameWorld.DebugLog('ʹÓõÀ¾ß¼õÉٶɽٴò×øÊ±¼ä µÀ¾ß²»×ã%s' % useCnt)  | 
| #        return  | 
| #      | 
| #    ItemCommon.ReduceItem(curPlayer, itemPack, itemList, useCnt, False)  | 
| #      | 
| #    reduceTime = useCnt * singleReduceTime  | 
| #    sitRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmSitRemainTime)  | 
| #    newRemainTime = max(0, sitRemainTime-reduceTime)  | 
| #    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmSitRemainTime, newRemainTime)  | 
| #    GameWorld.DebugLog('ʹÓõÀ¾ß¼õÉٶɽٴò×øÊ±¼ä Ê¹ÓõÀ¾ß%s,¼õÉÙ´ò×øÊ±¼ä%sÃë' % (useCnt, reduceTime))  | 
| #    SyncRealmFBState(curPlayer)  | 
|     return  |