#!/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