| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GM.Commands.Championship  | 
| #  | 
| # @todo:¿ç·þÅÅλÕù°ÔÈü  | 
| # @author hxp  | 
| # @date 2022-09-21  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ¿ç·þÅÅλÕù°ÔÈü  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2022-09-21 21:30"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import GameWorld  | 
| import CrossChampionship  | 
| import PlayerDBGSEvent  | 
| import ShareDefine  | 
| import time  | 
|   | 
|   | 
| #Â߼ʵÏÖ  | 
| ## Ö´ÐÐÂß¼  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param gmList [cmdIndex gmAccID msg]  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def OnExec(curPlayer, gmList):  | 
|     ## ±¾·þ´¦Àí  | 
|     GameWorld.DebugAnswer(curPlayer, "----------------------------")  | 
|     if not gmList:  | 
|         champMgr = CrossChampionship.GetChampionshipMgr()  | 
|         ID = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID)  | 
|         State = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState)  | 
|         GameWorld.DebugAnswer(curPlayer, "¿ç·þÅÅλÕù°Ô£ºID:%s,State:%s,%s" % (ID, State, champMgr.GetChampPKZoneIDList()))  | 
|         GameWorld.DebugAnswer(curPlayer, "ÖØÖûÊý¾Ý: Championship 0 ÊÇ·ñÖØÖÃÏɹÙ")  | 
|         GameWorld.DebugAnswer(curPlayer, "Êä³ö»î¶¯Êý¾Ý: Championship print")  | 
|         GameWorld.DebugAnswer(curPlayer, "ÉèÖòÎÈüÍæ¼Ò: Championship 80 ·ÖÇø ÈËÊý Íæ¼ÒID1 ...")  | 
|         GameWorld.DebugAnswer(curPlayer, "ÈËÊý×î´ó64£¬²»×ãÔò¿ÉÄÜÓÐÂÖ¿ÕµÄ×飬ָ¶¨Íæ¼ÒID²»×ãÈËÊýÔòÒÔ¼ÙÈË´úÌæ")  | 
|         GameWorld.DebugAnswer(curPlayer, "Ö¸¶¨Íæ¼Ò·Ö×é: Championship ·Ö×é״̬ ·ÖÇøID Íæ¼ÒID1 ID2 ...")  | 
|         GameWorld.DebugAnswer(curPlayer, "·Ö×é״̬:641-64Ç¿£»321-32Ç¿£»161-16Ç¿£»81-8Ç¿£»ID1ID2Á½Á½·ÖÔÚÒ»×é")  | 
|         GameWorld.DebugAnswer(curPlayer, "Èç¹ûûÓÐÖ¸¶¨IDÔò¸Ã×éÖØÐÂËæ»úÆ¥Åä")  | 
|         GameWorld.DebugAnswer(curPlayer, "ÃüÁîÐèÔÚ¶ÔÓ¦µÄ½×¶ÎÉèÖòÅÓÐЧ;")  | 
|         GameWorld.DebugAnswer(curPlayer, "ÖØÖûÊý¾ÝÐèÔڷǻʱ¼äÖØÖ㬲»È»¿ÉÄܵ¼Ö»״̬Òì³£")  | 
|         GameWorld.DebugAnswer(curPlayer, "ÐéÄâ½áËãÅÅÃû: Championship 8 ·ÖÇø µÚ1ÃûID ...")  | 
|         GameWorld.DebugAnswer(curPlayer, "ÐéÄâ½áËãÖ´ÐÐ: Championship over")  | 
|         GameWorld.DebugAnswer(curPlayer, "×¢:ÐéÄâ½áËãµÄÃüÁîÖ÷ÒªÓÃÓÚ¿ìËÙ²âÊÔ½áËãÓÃ,Íæ¼ÒID²»×ãÔò¼ÙÈË´úÌæ")  | 
|           | 
|     else:  | 
|         value1 = gmList[0]  | 
|           | 
|         if value1 == "print":  | 
|             __PrintChampionshipInfo()  | 
|             return  | 
|           | 
|     return  | 
|   | 
| def OnGetMergeParam(curPlayer):  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     serverGroupID = GameWorld.GetServerGroupID()  | 
|     return [serverGroupID, playerID]  | 
|   | 
| def OnMergeServerExec(gmList, tick):  | 
|     ## ¿ç·þ´¦Àí  | 
|       | 
|     serverGroupID = gmList[-2]  | 
|     playerID = gmList[-1]  | 
|       | 
|     gmList = gmList[:-2]  | 
|     if not gmList:  | 
|         return  | 
|       | 
|     value1 = gmList[0]  | 
|       | 
|     if value1 == "print":  | 
|         __PrintChampionshipInfo()  | 
|         GameWorld.DebugAnswerCross(playerID, serverGroupID, "Êä³öÍê±Ï£¬Çë²é¿´¿ç·þGameServerÈÕÖ¾")  | 
|         return  | 
|       | 
|     state = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState)  | 
|     champMgr = CrossChampionship.GetChampionshipMgr()  | 
|     #pkZoneIDList = champMgr.GetChampPKZoneIDList()  | 
|     if value1 == 0:  | 
|         if state in ShareDefine.CrossChampionshipStateList and state != ShareDefine.CrossChampionshipStateList[0]:  | 
|             GameWorld.DebugAnswerCross(playerID, serverGroupID, "ÖØÖÃÊý¾ÝÐèÔڷǻÖлò64Ç¿·Ö×éǰ")  | 
|             return  | 
|           | 
|         isResetOfficial = gmList[1] if len(gmList) > 1 else 0  | 
|           | 
|         PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID, 0)  | 
|         PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState, 0)  | 
|         PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError, 0)  | 
|         PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipErrorDo, 0)  | 
|           | 
|         champMgr.ClearPKZone()  | 
|         if isResetOfficial:  | 
|             champMgr.ClearOfficialZone()  | 
|               | 
|         GameWorld.DebugAnswerCross(playerID, serverGroupID, "ÖØÖÃÊý¾Ý³É¹¦")  | 
|           | 
|         CrossChampionship.Sync_CrossChampionshipDataToClientServer()  | 
|         CrossChampionship.OnMinuteProcess()  | 
|         return  | 
|       | 
|     stateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError)  | 
|     if stateError:  | 
|         GameWorld.DebugAnswerCross(playerID, serverGroupID, "»î¶¯Êý¾Ý״̬˳ÐòÒѾÒì³££¬ÎÞ·¨´¦Àí")  | 
|         return  | 
|       | 
|     if value1 in ShareDefine.CrossChampionshipStateList:  | 
|         if state != value1:  | 
|             GameWorld.DebugAnswerCross(playerID, serverGroupID, "·Ç¶ÔÓ¦»î¶¯×´Ì¬ÖУ¬ÎÞ·¨ÉèÖ㬵±Ç°×´Ì¬%s" % state)  | 
|             return  | 
|           | 
|     maxPlayerCount = CrossChampionship.Def_CrossChampionshipPlayerMax  | 
|     # ÉèÖòÎÈüÍæ¼Ò  | 
|     if value1 == ShareDefine.CrossChampionshipState_Guess8:  | 
|         if len(gmList) < 3:  | 
|             GameWorld.DebugAnswerCross(playerID, serverGroupID, "²ÎÊý´íÎó£¬Ïê¼ûÃüÁî˵Ã÷")  | 
|             return  | 
|         zoneID = gmList[1]  | 
|         batPlayerCount = min(maxPlayerCount, gmList[2])  | 
|         setPlayerIDList = gmList[3:]  | 
|         pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)  | 
|         if not pkZoneMgr:  | 
|             GameWorld.DebugAnswerCross(playerID, serverGroupID, "²»´æÔڸ÷ÖÇø!zoneID=%s" % zoneID)  | 
|             return  | 
|         if len(setPlayerIDList) < batPlayerCount:  | 
|             # ²»×ãµÄ»úÆ÷È˲¹×ã  | 
|             setPlayerIDList += range(1001, 1001 + (batPlayerCount - len(setPlayerIDList)))  | 
|         pkZoneMgr.playerDict = {} # Çå¿ÕÍæ¼Ò£¬ÖØÐÂÉèÖà  | 
|         CrossChampionship.Send_CrossServerMsg_ChampionshipPlayer(isSync=True, clearPlayer=True)  | 
|         for pID in setPlayerIDList:  | 
|             batPlayer = CrossChampionship.ChampionshipBatPlayer()  | 
|             batPlayer.zoneID = zoneID  | 
|             batPlayer.playerID = pID  | 
|             pkZoneMgr.playerDict[pID] = batPlayer  | 
|               | 
|         GameWorld.DebugAnswerCross(playerID, serverGroupID, "ÉèÖòÎÈüÍæ¼Ò³É¹¦:zoneID=%s,ÈËÊý=%s" % (zoneID, len(setPlayerIDList)))  | 
|         CrossChampionship.Send_CrossServerMsg_ChampionshipPlayer(isSync=True)  | 
|         return  | 
|       | 
|     # Ö¸¶¨Íæ¼Ò·Ö×é  | 
|     canSetGroupStateList = [ShareDefine.CrossChampionshipState_Group64, ShareDefine.CrossChampionshipState_Group32,   | 
|                             ShareDefine.CrossChampionshipState_Group16, ShareDefine.CrossChampionshipState_Group8]  | 
|     if value1 in canSetGroupStateList:  | 
|         if len(gmList) < 2:  | 
|             GameWorld.DebugAnswerCross(playerID, serverGroupID, "·Ö×é²ÎÊý´íÎó£¬Ïê¼ûÃüÁî˵Ã÷")  | 
|             return  | 
|         groupMark = value1 / 10  | 
|         zoneID = gmList[1]  | 
|         groupPlayerIDList = gmList[2:]  | 
|         pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)  | 
|         if not pkZoneMgr:  | 
|             GameWorld.DebugAnswerCross(playerID, serverGroupID, "²»´æÔڸ÷ÖÇø!zoneID=%s" % zoneID)  | 
|             return  | 
|         if not groupPlayerIDList:  | 
|             pkZoneMgr.battleInfo.pop(groupMark, None)  | 
|             CrossChampionship.DoCrossChampionshipGroupRand(groupMark)  | 
|             GameWorld.DebugAnswerCross(playerID, serverGroupID, "%sÇ¿ÈüÖØÐÂËæ»úÆ¥Åä!" % groupMark)  | 
|             return  | 
|                   | 
|         for i in range(len(groupPlayerIDList))[::2]:  | 
|             vsI = i + 1  | 
|             if len(groupPlayerIDList) < vsI:  | 
|                 GameWorld.DebugAnswerCross(playerID, serverGroupID, "ÉèÖ÷Ö×éÍæ¼ÒIDÊý²»Æ¥Åä")  | 
|                 break  | 
|             APlayerID = groupPlayerIDList[i]  | 
|             BPlayerID = groupPlayerIDList[vsI]  | 
|               | 
|             changeBatNum = None  | 
|             vsPlayerIDList = [APlayerID, BPlayerID]  | 
|             chPlayerIDList = []  | 
|               | 
|             battleDict = pkZoneMgr.battleInfo.get(groupMark, {})  | 
|             for battleNum in battleDict.keys():  | 
|                 batObj = pkZoneMgr.GetBattle(groupMark, battleNum)  | 
|                 if not batObj:  | 
|                     continue  | 
|                 playerIDList = [batObj.playerIDA, batObj.playerIDB]  | 
|                 if APlayerID in playerIDList and BPlayerID in playerIDList:  | 
|                     GameWorld.DebugAnswerCross(playerID, serverGroupID, "ÉèÖóɹ¦:%s VS %s" % (APlayerID, BPlayerID))  | 
|                     break  | 
|                 if APlayerID not in playerIDList and BPlayerID not in playerIDList:  | 
|                     continue  | 
|                   | 
|                 for pID in playerIDList:  | 
|                     if pID not in vsPlayerIDList:  | 
|                         chPlayerIDList.append(pID)  | 
|                           | 
|                 if changeBatNum == None:  | 
|                     changeBatNum = battleNum  | 
|                     continue  | 
|                   | 
|                 changeBatObj = pkZoneMgr.GetBattle(groupMark, changeBatNum)  | 
|                 changeBatObj.playerIDA = vsPlayerIDList[0]  | 
|                 changeBatObj.playerIDB = vsPlayerIDList[1]  | 
|                   | 
|                 batObj.playerIDA = chPlayerIDList[0] if len(chPlayerIDList) > 0 else 0  | 
|                 batObj.playerIDB = chPlayerIDList[1] if len(chPlayerIDList) > 1 else 0  | 
|                 GameWorld.DebugAnswerCross(playerID, serverGroupID, "ÉèÖóɹ¦:%s VS %s" % (APlayerID, BPlayerID))  | 
|                 GameWorld.DebugAnswerCross(playerID, serverGroupID, "½»»»³É¹¦:%s VS %s" % (batObj.playerIDA, batObj.playerIDB))  | 
|                 changeBatNum = "OK"  | 
|                   | 
|             if changeBatNum != "OK":  | 
|                 GameWorld.DebugAnswerCross(playerID, serverGroupID, "·Ö×éʧ°Ü£¬¼ì²éÍæ¼ÒÊÇ·ñÔÚ±¾·Ö×é:%s VS %s" % (APlayerID, BPlayerID))  | 
|                   | 
|         CrossChampionship.Send_CrossServerMsg_ChampionshipGroup(groupMark)  | 
|         return  | 
|       | 
|     if value1 == 8:  | 
|         __FackOverData(playerID, serverGroupID, gmList)  | 
|         return  | 
|     if value1 == "over":  | 
|         GameWorld.DebugAnswerCross(playerID, serverGroupID, "ÐéÄâ½áËãÖ´ÐÐ")  | 
|         CrossChampionship.DoCrossChampionshipFinalOver()  | 
|         return  | 
|     GameWorld.DebugAnswerCross(playerID, serverGroupID, "ÃüÁî²ÎÊý´íÎó£¬Ïê¼ûÃüÁî˵Ã÷")  | 
|     return  | 
|   | 
| def __FackOverData(playerID, serverGroupID, gmList):  | 
|     ## ÐéÄâ½áËãÊý¾Ý  | 
|     zoneID = gmList[1] if len(gmList) > 1 else 0  | 
|     rankPlayerIDList = gmList[2:]  | 
|     batPlayerCount = CrossChampionship.Def_CrossChampionshipPlayerWFCount  | 
|     # ÏÈÉèÖòÎÈüÍæ¼Ò  | 
|     champMgr = CrossChampionship.GetChampionshipMgr()  | 
|     pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)  | 
|     if len(rankPlayerIDList) < batPlayerCount:  | 
|         # ²»×ãµÄ»úÆ÷È˲¹×ã  | 
|         zonePlayerIDStar = zoneID * 100 + 1 # È·±£Ã¿¸ö·ÖÇøµÄ¼ÙÈ˲»Öظ´  | 
|         rankPlayerIDList += range(zonePlayerIDStar, zonePlayerIDStar + (batPlayerCount - len(rankPlayerIDList)))  | 
|     pkZoneMgr.playerDict = {} # Çå¿ÕÍæ¼Ò£¬ÖØÐÂÉèÖà  | 
|     CrossChampionship.Send_CrossServerMsg_ChampionshipPlayer(isSync=True, clearPlayer=True)  | 
|     for pID in rankPlayerIDList:  | 
|         batPlayer = CrossChampionship.ChampionshipBatPlayer()  | 
|         batPlayer.zoneID = zoneID  | 
|         batPlayer.playerID = pID  | 
|         pkZoneMgr.playerDict[pID] = batPlayer  | 
|     CrossChampionship.Send_CrossServerMsg_ChampionshipPlayer(isSync=True)  | 
|       | 
|     # ÐéÄâÕ½¶·³¡´Î  | 
|     overTime = int(time.time())  | 
|     pkZoneMgr.battleInfo = {} # Çå¿Õ¶ÔÕ½¼Ç¼  | 
|     battleIndexDict = {8:[[1, 5], [3, 7], [2, 6], [4, 8]], 4:[[1, 3], [5, 7], [2, 4], [6, 8]], 2:[[1, 2], [3, 4], [5, 6], [7, 8]]}  | 
|     for groupMark in [8, 4, 2]:  | 
|         battleList = battleIndexDict[groupMark]  | 
|         for battleNum in range(1, 1 + len(battleList)):  | 
|             battleRankInfo = battleList[battleNum - 1]  | 
|             battle = CrossChampionship.ChampionshipBattle()  | 
|             battle.overTime = overTime  | 
|             battle.zoneID = zoneID  | 
|             battle.groupMark = groupMark  | 
|             battle.battleNum = battleNum  | 
|             battle.playerIDA = rankPlayerIDList[battleRankInfo[0] - 1]  | 
|             battle.playerIDB = rankPlayerIDList[battleRankInfo[1] - 1]  | 
|             battle.winPlayerID = battle.playerIDA  | 
|             pkZoneMgr.AddBattle(groupMark, battleNum, battle)  | 
|         CrossChampionship.Send_CrossServerMsg_ChampionshipGroup(groupMark)  | 
|           | 
|     GameWorld.DebugAnswerCross(playerID, serverGroupID, "ÐéÄâ½áËãÅÅÃû:·ÖÇø%s,%s" % (zoneID, rankPlayerIDList))  | 
|     return  | 
|   | 
| def __PrintChampionshipInfo():  | 
|     GameWorld.Log("================ ¿ç·þÅÅλµ±Ç°ÐÅÏ¢ ==================")  | 
|     ID = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID)  | 
|     state = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState)  | 
|     stateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError)  | 
|     champMgr = CrossChampionship.GetChampionshipMgr()  | 
|     pkZoneIDList = champMgr.GetChampPKZoneIDList()  | 
|     GameWorld.Log("ID=%s,state=%s,stateError=%s,pkZoneIDList=%s" % (ID, state, stateError, pkZoneIDList))  | 
|     for zoneID in pkZoneIDList:  | 
|         pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)  | 
|         if not pkZoneMgr:  | 
|             continue  | 
|           | 
| #            self.guessInfo = {} # ¾º²ÂÐÅÏ¢ {¾º²ÂÀàÐÍ:[ChampionshipGuess, ...], ...}  | 
| #            self.superPlayerCountInfo = {} # {¾º²ÂÀàÐÍ:{playerID:Ö§³ÖÈËÊý, ...}, ...}  | 
|           | 
|         batPlayerIDList = pkZoneMgr.GetBatPlayerIDList()  | 
|         GameWorld.Log("=== ²ÎÈüÍæ¼Ò === zoneID=%s,playerCount=%s" % (zoneID, len(batPlayerIDList)))  | 
|         for i, playerID in enumerate(batPlayerIDList, 1):  | 
|             batPlayer = pkZoneMgr.GetBatPlayer(playerID)  | 
|             if not batPlayer:  | 
|                 continue  | 
|             GameWorld.Log("    %s,playerID=%s,fightPower=%s,accID=%s" % (i, batPlayer.playerID, batPlayer.fightPower, batPlayer.accID))  | 
|               | 
|         groupMarkKeys = pkZoneMgr.battleInfo.keys()  | 
|         GameWorld.Log("=== ·Ö×éÐÅÏ¢ === zoneID=%s,%s" % (zoneID, groupMarkKeys))  | 
|         for groupMark, battleDict in pkZoneMgr.battleInfo.items():  | 
|             GameWorld.Log("    groupMark=%s,battleCount=%s" % (groupMark, len(battleDict)))  | 
|             for battleNum in battleDict.keys():  | 
|                 batObj = pkZoneMgr.GetBattle(groupMark, battleNum)  | 
|                 if not batObj:  | 
|                     continue  | 
|                 GameWorld.Log("        groupMark=%s,battleNum=%s,playerIDA=%s,playerIDB=%s,winPlayerID=%s"   | 
|                               % (groupMark, battleNum, batObj.playerIDA, batObj.playerIDB, batObj.winPlayerID))  | 
|                   | 
|         GameWorld.Log("=== ¾º²ÂÐÅÏ¢ === zoneID=%s,%s" % (zoneID, pkZoneMgr.guessInfo.keys()))  | 
|         for guessType, playerGuessDict in pkZoneMgr.guessInfo.items():  | 
|             GameWorld.Log("    zoneID=%s,guessType=%s,supportCountInfo=%s" % (zoneID, guessType, pkZoneMgr.supportCountInfo.get(guessType, {})))  | 
|             GameWorld.Log("    guessPlayerIDList=%s" % playerGuessDict.keys())  | 
|             for guessPlayerID, guessObjList in playerGuessDict.items():  | 
|                 GameWorld.Log("    guessPlayerID=%s,guessObjListLen=%s" % (guessPlayerID, len(guessObjList)))  | 
|                 for guessObj in guessObjList:  | 
|                     GameWorld.Log("        guessPlayerID=%s,tagPlayerID=%s,moneyTotal=%s,guessRank=%s,isClose=%s"   | 
|                                   % (guessPlayerID, guessObj.tagPlayerID, guessObj.moneyTotal, guessObj.guessRank, guessObj.isClose))  | 
|             GameWorld.Log("    ===")  | 
|               | 
|     offZoneIDList = champMgr.GetChampOfficialZoneIDList()  | 
|     GameWorld.Log("ÏɹٷÖÇø: offZoneIDList=%s" % offZoneIDList)  | 
|     for zoneID in offZoneIDList:  | 
|         offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)  | 
|         officialIDList = offZoneMgr.officialInfo.keys()  | 
|         GameWorld.Log("=== ÏɹÙÐÅÏ¢ === zoneID=%s,%s" % (zoneID, officialIDList))  | 
|         for officialID in officialIDList:  | 
|             offObj = offZoneMgr.GetOfficialObj(officialID)  | 
|             if not offObj:  | 
|                 continue  | 
|             GameWorld.Log("    officialID=%s,playerID=%s,rank=%s,worshipCount=%s,worshipDouble=%s,applyPlayerIDList=%s,challengeCount=%s,lastDismissJuniorTime=%s"   | 
|                           % (officialID, offObj.playerID, offObj.rank, offObj.worshipCount, offObj.worshipDouble, offObj.applyPlayerInfo.keys(), len(offObj.challengeList), offObj.lastDismissJuniorTime))  | 
|               | 
|     GameWorld.Log("==================================================")  | 
|     return  | 
|   |