| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #---------------------------------------------------------------------  | 
| #  | 
| #---------------------------------------------------------------------  | 
| ##@package PlayerMergeRegister.py  | 
| # @todo: Íæ¼Ò¿ç·þÈü±¨Ãû  | 
| #  | 
| # @author: wdb  | 
| # @date 2012-10-31 16:50  | 
| # @version 2.2  | 
| # @note:  | 
| # @change: "2013-03-13 17:00" wdb É¾³ý·â°ü  | 
| # @change: "2015-09-11 15:00" hxp »Ö¸´¿ç·þÊý¾ÝÉÏ´«£¬¿ç·þÕ˺Ųéѯ£»Ôö¼Ó¿ç·þboss  | 
| # @change: "2015-09-21 20:00" hxp ¿ç·þÕ˺ÅÐÅÏ¢¼Ç¼Ôö¼Ó±¾·þÕ˺ÅÐÅÏ¢  | 
| # @change: "2015-09-24 20:00" hxp Ôö¼ÓIsMergeOpenÅжÏ; Ôö¼Ó»î¶¯Î´¿ªÆô¼°Ìáǰ½áÊøÌáʾ  | 
| # @change: "2015-09-26 15:30" hxp ¿ç·þÖ÷·þÎñÆ÷²»ÔÊÐíÉÏ´«±¨ÃûÊý¾Ý  | 
| # @change: "2015-10-28 00:00" hxp Ôö¼Ó¿ç·þPK  | 
| # @change: "2015-11-05 12:00" hxp ¿ç·þÐÂÕ˺Åͬ²½Ôö¼ÓÕ½Á¦ÐÅÏ¢  | 
| # @change: "2015-11-13 17:00" hxp Ôö¼ÓÍõÕßÕù°Ô  | 
| # @change: "2015-12-02 16:00" hxp Ôö¼ÓÉÏ´«¼°²éѯ¿ç·þÕ˺ÅÈÕÖ¾  | 
| # @change: "2016-12-20 17:30" hxp ÓÀºã°æÐÞ¸Ä  | 
| # @change: "2017-06-22 15:00" hxp ¿ç·þºé»ÄÖ®Á¦Ö§³Ö; ¿ç·þ»î¶¯µØÍ¼·ÖÅ乿Ôò¸ÄΪÔÚGameServerÅäÖà  | 
| # @change: "2017-07-06 20:30" hxp ¿ç·þboss½ø³¡·ÖÅäÈËÊý·½Ê½Ð޸ģ»Ö§³ÖÖ¸¶¨µØÍ¼¼°°´ÈËÊý·ÖÅäµØÍ¼Á½ÖÖģʽ²¢´æ  | 
| #---------------------------------------------------------------------  | 
| #"""Version = 2017-07-06 20:30"""  | 
| #---------------------------------------------------------------------  | 
| import ChConfig  | 
| import GameWorld  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import ShareDefine  | 
| import PlayerUniversalGameRec  | 
| import GameWorldMergeBoss  | 
| import GameWorldMergeKing  | 
| import GameWorldMergePK  | 
| import PlayerControl  | 
| import MergeChildMsg  | 
| import ReadChConfig  | 
|   | 
| import random  | 
| import time  | 
| #---------------------------------------------------------------------  | 
| #//C0 11 ÉÏ´«Êý¾ÝµÄ»î¶¯ÀàÐÍ #tagActionMergeRegister  | 
| #  | 
| #struct    tagActionMergeRegister  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        ActionType;        //»î¶¯ÀàÐÍ          | 
| #};  | 
| #---------------------------------------------------------------------  | 
|   | 
| ## ¿ç·þÈü±¨Ãû£¨ÉÏ´«Êý¾Ý£©  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def MergeWarRegisterPack(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     if not curPlayer:  | 
|         return  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     actionType = clientData.ActionType  | 
|     GameWorld.Log("MergeWarRegisterPack actionType=%s" % actionType, playerID)  | 
|       | 
|     if GameWorld.IsMergeServer():  | 
|         GameWorld.Log("    ¿ç·þ·þÎñÆ÷²»ÔÊÐíÉÏ´«±¨ÃûÊý¾Ý!", playerID)  | 
|         return  | 
|       | 
|     if actionType >= ShareDefine.Def_MergeAction_TypeMax:  | 
|         return     | 
|   | 
|     #¼ä¸ôδµ½  | 
|     if not GameWorld.RefurbishPlayerTick(curPlayer, ChConfig.TYPE_Player_Tick_MergeRegister, tick):  | 
|         GameWorld.Log("    ÉÏ´«¼ä¸ôδµ½ %s" % actionType, playerID)  | 
|         return  | 
|   | 
|     # µ±Ç°»î¶¯µÄÉÏ´«Êý¾ÝÊÇ·ñ¿ªÆô  | 
|     if not IsCurActionRegisterOpen(actionType, curPlayer, True):  | 
|         GameWorld.Log("    µ±Ç°»î¶¯µÄÉÏ´«Êý¾Ý먦Æô %s" % actionType, playerID)  | 
|         return  | 
|   | 
|     # Íæ¼ÒÊÇ·ñÓе±Ç°»î¶¯µÄÉÏ´«Êý¾Ý×ʸñ  | 
|     if not CheckPlayerCanMergeRegister(curPlayer, actionType):  | 
|         GameWorld.Log("    Íæ¼ÒûÓе±Ç°»î¶¯µÄÉÏ´«Êý¾Ý×ʸñ %s" % actionType, playerID)  | 
|         return  | 
|       | 
|     mapPosInfo = [ChConfig.Def_MergeTransMapID, ChConfig.Def_MergeTransMapID, 0] + ChConfig.Def_MergeTransMapPos  | 
|     #if actionType in [ShareDefine.Def_MergeAction_Boss]:  | 
|     #    mapPosInfo = GetMergeActionMapPos(actionType)  | 
|           | 
|     SendMergeActionReg(curPlayer, actionType, mapPosInfo)  | 
|     return  | 
|   | 
| def SendMergeActionReg(curPlayer, actionType, mapPosInfo):  | 
|     # ·¢ËÍ¿ç·þÕ˺Å×¢²áÉÏ´«Êý¾Ý  | 
|     # ÉèÖÃÉÏ´«Êý¾ÝµÄÀàÐÍ  | 
|     curPlayer.SetDict(ChConfig.Def_PlayerKey_MergeRegisterType, actionType)  | 
|     sysMsg = str([actionType] + mapPosInfo)  | 
|     curPlayer.MapServer_QueryPlayerResult(0, 0, 'MergeWarRegister', sysMsg, len(sysMsg))              | 
|     GameWorld.Log("    MapServer_QueryPlayerResult  MergeWarRegister actionType=%s, sysMsg=%s"   | 
|                   % (actionType, sysMsg), curPlayer.GetPlayerID())  | 
|     return  | 
|   | 
| def GetMergeActionMapPos(actionType):  | 
|     # »ñÈ¡¿ç·þ»î¶¯¶ÔÓ¦ÉÏ´«Êý¾ÝµØÍ¼×ø±ê   | 
|     # @return: [mapID,dataMapID,copyMapID,posX,posY]  | 
|       | 
|     MergeActionMapPosDict = ReadChConfig.GetEvalChConfig("MergeActionMapPos")  | 
|     if actionType not in MergeActionMapPosDict:  | 
|         #GameWorld.ErrLog("¿ç·þÉÏ´«Êý¾ÝÕÒ²»µ½»î¶¯ÀàÐÍ(%s)¶ÔÓ¦µØÍ¼×ø±êÅäÖ㬼ì²éMergeActionMapPos.txt!" % actionType)  | 
|         return  | 
|       | 
|     mapPosDict = MergeActionMapPosDict[actionType]  | 
|     if not mapPosDict:  | 
|         #GameWorld.ErrLog("¿ç·þÉÏ´«Êý¾ÝÕÒ²»µ½»î¶¯ÀàÐÍ(%s)¶ÔÓ¦µØÍ¼×ø±êÅäÖ㬼ì²éMergeActionMapPos.txt!!" % actionType)  | 
|         return  | 
|       | 
|     mapPosList = []  | 
|     # Íæ¼ÒËùÊôÔʼ·þÎñÆ÷ID  | 
|     mergeServerID = GameWorld.GetMergeServerID()  | 
|     for serverIDTupleKey, posList in mapPosDict.items():  | 
|         for serverID in serverIDTupleKey:  | 
|             if (isinstance(serverID, int) and serverID == mergeServerID) or \  | 
|                 (isinstance(serverID, tuple) and len(serverID) == 2 \  | 
|                     and serverID[0] <= mergeServerID <= serverID[1]):  | 
|                 mapPosList = posList  | 
|                 break  | 
|               | 
|         if mapPosList:  | 
|             break  | 
|       | 
|     if not mapPosList:  | 
|         #GameWorld.ErrLog("¿ç·þÉÏ´«Êý¾ÝÕÒ²»µ½»î¶¯ÀàÐÍ(%s),serverID=%s,¶ÔÓ¦µØÍ¼×ø±êÅäÖ㬼ì²éMergeActionMapPos.txt!!"   | 
|         #                 % (actionType, mergeServerID))  | 
|         return  | 
|       | 
|     mapPosInfo = random.choice(mapPosList)  | 
|     if len(mapPosInfo) != 5:  | 
|         GameWorld.ErrLog("¿ç·þÉÏ´«Êý¾Ý»î¶¯ÀàÐÍ(%s),serverID=%s,¶ÔÓ¦µØÍ¼×ø±êÅäÖôíÎ󣬼ì²éMergeActionMapPos.txt!"   | 
|                          % (actionType, mergeServerID))  | 
|         return  | 
|       | 
|     return mapPosInfo  | 
|   | 
| ## ¿ç·þÈü±¨Ãû»ñµÃÐÂÕ˺Š | 
| #  @param playerID: Íæ¼ÒʵÀý  | 
| #  @param msgList: ±»É±Íæ¼Òid  | 
| #  @param tick  | 
| #  @return: None  | 
| def MergeWarRegisterNewAcc(playerID, msgList, tick):   | 
|     actionType = ShareDefine.Def_MergeAction_MergeWar  | 
|       | 
|     accID = ""  | 
|     curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)  | 
|     if curPlayer != None:  | 
|         # ÉèÖÃÉÏ´«Êý¾ÝµÄÀàÐÍ  | 
|         actionType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MergeRegisterType)     | 
|         accID = curPlayer.GetAccID()  | 
|               | 
|     # ÐÂÕ˺Å, Ä¿Ç°Õ˺ÅÒÑÈ·±£ÔÚËùÓÐÆ½Ì¨ÖÐΨһ£¬¹Ê¿ç·þÕ˺ÅÖ±½ÓÓñ¾·þÕ˺ż´¿É  | 
|     newAccID, newPwd, fightPower, playerLV, maxHP = msgList  | 
|     if not accID:  | 
|         accID = newAccID  | 
|         | 
|     #¿ç·þÈüÊý¾Ý  | 
|     universalRecMgr = GameWorld.GetUniversalRecMgr()    | 
|     recTypeListData = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_MergeRegister)  | 
|       | 
|     # ²éÕÒÊÇ·ñÒÑÓмǼ  | 
|     playerRec = None  | 
|     for index in xrange(recTypeListData.Count()):  | 
|         universalRecData = recTypeListData.At(index)  | 
|         if universalRecData.GetValue1() == playerID:  | 
|             playerRec = universalRecData  | 
|             break  | 
|           | 
|     if playerRec == None:            | 
|         #»¹Î´¼Ç¼£¬ÔòÌí¼ÓÒ»¸ö¼Ç¼¶ÔÏó  | 
|         playerRec = recTypeListData.AddRec()          | 
|         playerRec.SetValue1(playerID)  | 
|       | 
|     curTime = int(time.time())  | 
|     playerRec.SetTime(curTime)  | 
|     playerRec.SetStrValue2(newPwd)  | 
|     PlayerUniversalGameRec.SetUniversalGameRecStrValue3(playerRec, newAccID)  | 
|   | 
|     GameWorld.Log("¿ç·þÈü±¨Ãû»ñµÃÐÂÕ˺ŠnewAccID=%s, newPwd=%s, actionType=%s, curTime=%s"   | 
|                   % (newAccID, newPwd, actionType, curTime), playerID)  | 
|     if not curPlayer:  | 
|         return  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     # ¿ç·þPKÉÏ´«Êý¾ÝÍê±Ï£¬Í¨Öª¿ç·þ·þÎñÆ÷£¬×¼±¸Íê±Ï  | 
|     if actionType == ShareDefine.Def_MergeAction_MergePK:  | 
|         regVSRoomID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MergeRegisterRoomID)   | 
|         vsRoomID = curPlayer.GetVsRoomId()  | 
|           | 
|         if regVSRoomID != vsRoomID:  | 
|             GameWorld.Log("ÉÏ´«¿ç·þ·þÎñÆ÷µÄregVSRoomID=%s£¬ÓëÍæ¼Òµ±Ç°µÄroomID=%s²»Í¬!²»·¢ËÍ×¼±¸Íê±Ï£¡"   | 
|                           % (regVSRoomID, vsRoomID), playerID)  | 
|             return  | 
|           | 
|         dataMsg = {  | 
|                    "playerAccID":accID, # ½ÇÉ«Õ˺ÅID  | 
|                    "playerID":playerID, # ½ÇÉ«ID  | 
|                    "playerName":curPlayer.GetName(), # ½ÇÉ«Ãû  | 
|                    "playerJob":curPlayer.GetJob(), # ½Çɫְҵ  | 
|                    "vsRoomID":vsRoomID, # ËùÊô¶ÔÕ½·¿¼äID  | 
|                    "fightPower":fightPower, # Õ½¶·Á¦  | 
|                    "playerLV":playerLV, # Íæ¼ÒµÈ¼¶  | 
|                    "maxHP":maxHP, # ×î´óѪÁ¿  | 
|                    }  | 
|         MergeChildMsg.SendMergerChildToCenterStringData(ChConfig.Def_MergePKPrepareOK, dataMsg)  | 
|         GameWorld.Log("֪ͨ¿ç·þ·þÎñÆ÷, Íæ¼ÒÆ¥ÅäPK×¼±¸Íê±Ï£¡%s" % str(dataMsg), playerID)  | 
|       | 
|     # ÉÏ´«Êý¾ÝÍê±Ï£¬Í¨ÖªÍæ¼Ò½øÈë¿ç·þÍõÕßÕù°Ô  | 
|     elif actionType == ShareDefine.Def_MergeAction_MergeKing:  | 
|         GameWorldMergeKing.Notify_PlayerEnterMergeKing(curPlayer)  | 
|     #elif actionType == ShareDefine.Def_MergeAction_Boss:  | 
|     #    # Ôݲ»´¦Àí  | 
|     #    pass  | 
|     # ÆäËûµÄ£¬ÔÚÉÏ´«Êý¾ÝÍê±Ïºó£¬Ê¹ÓÃͨÓõÄ֪ͨ¿É½øÈë¿ç·þ  | 
|     else:  | 
|         NotifyCanEnterMergeServer(curPlayer, actionType, newAccID, newPwd)  | 
|       | 
|     # hxp 2015.09.10 ¿ç·þboss£¬ºóÃæµÄÔÝʱ²»ÐèÒª  | 
|     return  | 
|   | 
| def GetMergeRegRecAccID(recData): return recData.GetStrValue3()  | 
|   | 
| ## ¿ç·þÈü±¨Ãû»ñµÃÍæ¼Ò¼Ç¼  | 
| #  @param playerID: Íæ¼ÒʵÀý  | 
| #  @return: None  | 
| def GetRegisterPlayerRec(playerID):   | 
|         | 
|     #¿ç·þÈüÊý¾Ý  | 
|     recType = ShareDefine.Def_UniversalGameRecType_MergeRegister  | 
|     universalRecMgr = GameWorld.GetUniversalRecMgr()    | 
|     recTypeListData = universalRecMgr.GetTypeList(recType)  | 
|       | 
|     # ²éÕÒÊÇ·ñÒÑÓмǼ  | 
|     for index in xrange(recTypeListData.Count()):  | 
|         universalRecData = recTypeListData.At(index)  | 
|           | 
|         if universalRecData.GetValue1() != playerID:  | 
|             continue  | 
|           | 
|         # ÐÂÕ˺Å,ÃÜÂë  | 
|         return universalRecData  | 
|       | 
|     return None  | 
|   | 
| def GetRegisterPlayerID(newAccID):   | 
|     ## ¸ù¾Ý¿ç·þÈüÐÂÕ˺ŻñµÃÍæ¼Òid  | 
|     if not newAccID:  | 
|         return 0  | 
|       | 
|     #¿ç·þÈüÊý¾Ý  | 
|     recType = ShareDefine.Def_UniversalGameRecType_MergeRegister  | 
|     universalRecMgr = GameWorld.GetUniversalRecMgr()    | 
|     recTypeListData = universalRecMgr.GetTypeList(recType)  | 
|       | 
|     # ²éÕÒÊÇ·ñÒÑÓмǼ  | 
|     for index in xrange(recTypeListData.Count()):  | 
|         universalRecData = recTypeListData.At(index)  | 
|           | 
|         if universalRecData.GetStrValue3() != newAccID:  | 
|             continue  | 
|           | 
|         return universalRecData.GetValue1()  | 
|       | 
|     return 0  | 
|   | 
| def NotifyCanEnterMergeServer(curPlayer, actionType, newAccID, newPwd):  | 
|     # Í¨Óðü£¬Í¨Öª¿Í»§¶Ë¿É½øÈë¿ç·þ·þÎñÆ÷  | 
|     mapID, lineID = 0, 0  | 
|     mapPosInfo = GetMergeActionMapPos(actionType)  | 
|     if mapPosInfo:  | 
|         mapID = mapPosInfo[0]  | 
|         lineID = mapPosInfo[2]  | 
|           | 
|     canEnterMServer = ChPyNetSendPack.tagCanEnterMergeServer()  | 
|     canEnterMServer.Clear()  | 
|     canEnterMServer.ActionType = actionType  | 
|     canEnterMServer.MapID = mapID  | 
|     canEnterMServer.LineID = lineID  | 
|     canEnterMServer.NewAccID = newAccID  | 
|     canEnterMServer.NewAccIDLen = len(canEnterMServer.NewAccID)  | 
|     canEnterMServer.NewPsw = newPwd  | 
|     canEnterMServer.NewPswLen = len(canEnterMServer.NewPsw)  | 
|     NetPackCommon.SendFakePack(curPlayer, canEnterMServer)  | 
|     return  | 
|   | 
| #----------------------------------------------------------------------  | 
| #//C0 12 ¿ç·þÈüÕ˺Ųéѯ #tagMergeWarAccQuery  | 
| #  | 
| #struct    tagMergeWarAccQuery  | 
| #{  | 
| #    tagHead        Head;  | 
| #};  | 
| #----------------------------------------------------------------------  | 
| ## ¿ç·þÈüÕ˺Ųéѯ  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def MergeWarAccQueryPack(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|   | 
|     actionType = clientData.ActionType  | 
|     if actionType >= ShareDefine.Def_MergeAction_TypeMax:  | 
|         GameWorld.ErrLog("    ·Ç·¨¿ç·þ»î¶¯ÀàÐÍ£¡actionType=%s" % actionType, curPlayer.GetPlayerID())  | 
|         return   | 
|       | 
|     # µ±Ç°»î¶¯µÄÉÏ´«Êý¾ÝÊÇ·ñ¿ªÆô  | 
|     if not IsCurActionRegisterOpen(actionType, curPlayer):  | 
|         GameWorld.Log("¿ç·þÈüÕ˺Ųéѯ£º ÉÏ´«Êý¾Ý먦Æô£¡actionType=%s" % actionType, curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     # ¿ç·þÈü±¨Ãû»ñµÃÍæ¼Ò¼Ç¼  | 
|     newPlayerInfo = GetRegisterPlayerRec(curPlayer.GetID())  | 
|     if newPlayerInfo == None:  | 
|         GameWorld.Log("    ÕÒ²»µ½¿ç·þÕ˺ÅÊý¾Ý£¡", curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     newAccID = newPlayerInfo.GetStrValue3()  | 
|     newPsw = newPlayerInfo.GetStrValue2()  | 
|       | 
|     resultPack = ChPyNetSendPack.tagMergeRegisterQueryResult()  | 
|     resultPack.Clear()  | 
|     resultPack.NewAccIDLen = len(newAccID)  | 
|     resultPack.NewAccID = newAccID  | 
|     resultPack.NewPswLen = len(newPsw)  | 
|     resultPack.NewPsw = newPsw  | 
|     NetPackCommon.SendFakePack(curPlayer, resultPack)  | 
|     GameWorld.Log("¿ç·þÈüÕ˺ŲéѯactionType=%s,newAccID=%s,newPsw=%s" % (actionType, newAccID, newPsw), curPlayer.GetPlayerID())  | 
|     return  | 
|   | 
| ## µ±Ç°»î¶¯µÄÉÏ´«Êý¾ÝÊÇ·ñ¿ªÆô  | 
| #  @param actionType »î¶¯ÀàÐÍ  | 
| #  @return bool  | 
| def IsCurActionRegisterOpen(actionType, curPlayer, isNotify=False):  | 
|       | 
|     if not GameWorld.IsMergeOpen():  | 
|         GameWorld.Log("IsCurActionRegisterOpen False!(Because IsMergeOpen() return False!)")  | 
|         return False  | 
|       | 
|     # ¿ç·þboss  | 
|     if actionType == ShareDefine.Def_MergeAction_Boss:  | 
|         return GameWorldMergeBoss.IsMergeBossOpen(curPlayer, isNotify)  | 
|       | 
|     # ¿ç·þPK  | 
|     elif actionType == ShareDefine.Def_MergeAction_MergePK:  | 
|         return GameWorldMergePK.IsMergePKMatchOpen()  | 
|       | 
|     # ¿ç·þÍõÕßÕù°Ô  | 
|     elif actionType == ShareDefine.Def_MergeAction_MergeKing:  | 
|         return GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_Merge_King) > 0  | 
|           | 
|     if isNotify:  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_hgg_21675")  | 
|           | 
|     return False  | 
|   | 
|   | 
| ## Íæ¼Òµ±Ç°»î¶¯ÊÇ·ñ¿ÉÒÔÉÏ´«Êý¾Ý  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param actionType »î¶¯ÀàÐÍ  | 
| #  @return bool  | 
| def CheckPlayerCanMergeRegister(curPlayer, actionType):  | 
|       | 
|     # ¿ç·þboss  | 
|     if actionType == ShareDefine.Def_MergeAction_Boss:  | 
|         return __CheckCanJoinMergeBoss(curPlayer)  | 
|       | 
|     return True  | 
|   | 
|   | 
| ## ¿ªÆô¿ç·þÈü±¨Ãû  | 
| #  @param None  | 
| #  @return: None  | 
| def __CheckCanJoinMergeBoss(curPlayer):  | 
|     joinCondition = ReadChConfig.GetEvalChConfig("MergeBoss_Condition")  | 
|     needLV = joinCondition[0]  | 
|     needFPOrder = joinCondition[1]  | 
|       | 
|     playerLV = curPlayer.GetLV()  | 
|     if needLV > 0 and playerLV < needLV:  | 
|         return False  | 
|       | 
|     if needFPOrder > 0:  | 
|         fpBillboardType = ShareDefine.Def_BT_FightPower  | 
|         billBoard = GameWorld.GetBillboard().FindBillboard(fpBillboardType)  | 
|         if not billBoard:  | 
|             GameWorld.ErrLog("__CheckCanJoinMergeBoss ÕÒ²»µ½ÅÅÐаñÊý¾Ý(%s)" % fpBillboardType)  | 
|             return False  | 
|           | 
|         order = billBoard.IndexOfByID(curPlayer.GetPlayerID()) + 1  # Íæ¼ÒÔÚÅÅÐаñÖеÄÃû´Î  | 
|         if order > needFPOrder or order <= 0:  | 
|             return False  | 
|       | 
|     return True  | 
|   |