#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package CrossChampionship # # @todo:¿ç·þÅÅλÕù°ÔÈü # @author hxp # @date 2022-09-21 # @version 1.0 # # ÏêϸÃèÊö: ¿ç·þÅÅλÕù°ÔÈü # #------------------------------------------------------------------------------- #"""Version = 2022-09-21 21:30""" #------------------------------------------------------------------------------- import GameWorld import ShareDefine import IpyGameDataPY import PlayerViewCache import PlayerDBGSEvent import ChPyNetSendPack import IPY_PlayerDefine import PlayerCompensation import CrossRealmPlayer import DataRecordPack import CrossRealmMsg import PlayerControl import PyDataManager import NetPackCommon import GameWorship import PyGameData import ChConfig import PlayerFB import datetime import random import time Def_CrossChampionshipPlayerMax = 64 # ×î´óÍæ¼ÒÊý Def_CrossChampionshipPlayerWFCount = 8 # ʤ¸ºÅÅλËùÐèÍæ¼ÒÊý Def_RecType_CrossChampionshipGroup = ShareDefine.Def_UniversalGameRecType_CrossChampionshipGroup ''' ¿ç·þÅÅλÕù°ÔÈü·Ö×éÐÅÏ¢ ShareDefine.Def_UniversalGameRecType_CrossChampionshipGroup time:time Õ½¶·½áËãʱ¼ä value1:zoneID ·ÖÇøID value2:groupInfo ·Ö×é±êʶ*100+¶ÔÕ½±àºÅ value3:playerIDA Íæ¼ÒIDA value4:playerIDB Íæ¼ÒIDB value5:winPlayerID »ñÊ¤Íæ¼ÒID ''' Def_RecType_CrossChampionshipGuess = ShareDefine.Def_UniversalGameRecType_CrossChampionshipGuess ''' ¿ç·þÅÅλÕù°ÔÈü¾º²Â¼Ç¼ÐÅÏ¢ ShareDefine.Def_UniversalGameRecType_CrossChampionshipGuess value1:zoneID ·ÖÇøID value2:guessInfo ¾º²ÂÀàÐÍ*100 + ¾º²ÂÖµ£º ÀàÐÍ£º8-8Ç¿£»4-4Ç¿£» Öµ£º¶ÔÓ¦ÅÅÃû value3:guessPlayerID ¾º²ÂÍæ¼ÒID value4:tagPlayerID Ä¿±êÍæ¼ÒID value5:moneyTotal Ͷע×Ü»õ±ÒÖµ StrValue1:isClose ÊÇ·ñÒѽáËã ''' Def_RecType_CrossChampionshipOfficial = ShareDefine.Def_UniversalGameRecType_CrossChampionshipOfficial ''' ¿ç·þÅÅλÕù°ÔÈü×îÖÕÅÅÃû¹ÙÖ°ÐÅÏ¢ ShareDefine.Def_UniversalGameRecType_CrossChampionshipOfficial time:time ÉÏÒ»´Î´ÇÍËϼ¶ÏɹÙʱ¼ä value1:zoneID¹ÙÖ°ID ¹ÙÖ°ID*10 + ·ÖÇøID value2:playerID Íæ¼ÒID£¬¿ÉÄÜΪ0 value3:worshipValue ±»Ä¤°Ý´ÎÊý*10 + ÊÇ·ñË«±¶ value4:rank ÅÅÃû StrValue3: [ÉêÇë¸Ã¹ÙÖ°Íæ¼ÒID,...] ''' Def_RecType_CrossChampionshipOffChallenge = ShareDefine.Def_UniversalGameRecType_CrossChampionshipOffChallenge ''' ¿ç·þÅÅλÕù°ÔÈü¹ÙÖ°ÌôÕ½ÐÅÏ¢ ShareDefine.Def_UniversalGameRecType_CrossChampionshipOffChallenge value1:zoneID¹ÙÖ°ID ¹ÙÖ°ID*10 + ·ÖÇøID StrValue3: {ÌôÕ½Íæ¼ÒÐÅÏ¢key:value, ...} ''' class ChampionshipOfficial(): ## Õù°ÔÈü¹Ù¾ôÍæ¼Ò def __init__(self): self.zoneID = 0 self.officialID = 0 # ¹ÙÖ°ID self.lastDismissJuniorTime = 0 # ÉϴδÇÍËϼ¶ÏɹÙʱ¼ä´Á self.rank = 0 # Ãû´Î self.worshipCount = 0 # ±»Ä¤°Ý´ÎÊý£¬ÈËÆøÖµ self.applyPlayerInfo = {} # ÉêÇë¸Ã¹ÙÖ°Íæ¼ÒÐÅÏ¢ {playerID:{Íæ¼Ò¼ò¶ÌÐÅÏ¢×Öµä}, ...} self.challengeList = [] # ÌôÕ½¼Ç¼ÐÅÏ¢ [{ÌôÕ½Íæ¼ÒÐÅÏ¢key:value, ...}, ...] key: Ret,AccID,Name,Time self.ResetPlayer() self.worshipDouble = 0 # Ĥ°ÝÊÇ·ñË«±¶ return def ResetPlayer(self): self.playerID = 0 self.accID = "" self.playerName = "" self.job = 0 self.lv = 0 self.fightPower = 0 self.realmLV = 0 return def GetString(self): for applyPlayerID in self.applyPlayerInfo.keys(): curCache = PlayerViewCache.FindViewCache(applyPlayerID) if curCache: playerShortInfo = {} cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) playerShortInfo["AccID"] = cacheDict.get("AccID", "") playerShortInfo["Name"] = cacheDict.get("Name", str(applyPlayerID)) playerShortInfo["Job"] = cacheDict.get("Job", 1) playerShortInfo["LV"] = cacheDict.get("LV", 1) playerShortInfo["FightPower"] = cacheDict.get("FightPower", 0) playerShortInfo["RealmLV"] = cacheDict.get("RealmLV", 0) self.applyPlayerInfo[applyPlayerID] = playerShortInfo return {"zoneID":self.zoneID, "officialID":self.officialID, "lastDismissJuniorTime":self.lastDismissJuniorTime, "accID":self.accID, "playerID":self.playerID, "playerName":self.playerName, "job":self.job, "lv":self.lv, "fightPower":self.fightPower, "realmLV":self.realmLV, "rank":self.rank, "worshipCount":self.worshipCount, "applyPlayerInfo":self.applyPlayerInfo, "challengeList":self.challengeList, "worshipDouble":self.worshipDouble } def SetAttr(self, attrDict): for k, v in attrDict.items(): setattr(self, k, v) return class ChampionshipOfficialZoneMgr(): ## Õù°ÔÈüÅÅλ·ÖÇø¹ÜÀí def __init__(self, zoneID): self.zoneID = zoneID self.officialInfo = {} # ¹Ù¾ôÐÅÏ¢ {officialID:ChampionshipOfficial, ...} return def GetOfficialObj(self, officialID): officialObj = None if officialID in self.officialInfo: officialObj = self.officialInfo[officialID] if GameWorld.IsCrossServer() and officialObj.playerID: UpdCachePlayerInfo(officialObj, officialObj.playerID) else: ipyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", officialID) if ipyData: officialObj = ChampionshipOfficial() officialObj.zoneID = self.zoneID officialObj.officialID = officialID self.officialInfo[officialID] = officialObj if not officialObj: GameWorld.ErrLog("ÏɹٹÙÖ°Êý¾ÝÐÅÏ¢²»´æÔÚ! officialID=%s" % officialID) return officialObj def GetPlayerOfficial(self, playerID): for offObj in self.officialInfo.values(): if offObj.playerID == playerID: return offObj return class ChampionshipGuess(): ## Õù°ÔÈü¾º²Â def __init__(self): self.zoneID = 0 self.guessType = 0 # ¾º²ÂÀàÐÍ£º8-8Ç¿£»4-4Ç¿ self.guessPlayerID = 0 # ¾º²ÂÍæ¼ÒID self.tagPlayerID = 0 # Ä¿±êÍæ¼ÒID self.moneyTotal = 0 # Ͷע×Ü»õ±ÒÖµ self.guessRank = 0 # ¾º²ÂÃû´Î£¬Ã»ÓÐÃû´ÎµÄ¾º²ÂĬÈÏ0£»1-´ú±íµÚÒ»Ãû self.isClose = 0 # ÊÇ·ñÒѽáËã return def GetString(self): return {"zoneID":self.zoneID, "guessType":self.guessType, "guessRank":self.guessRank, "guessPlayerID":self.guessPlayerID, "tagPlayerID":self.tagPlayerID, "moneyTotal":self.moneyTotal} def SetAttr(self, attrDict): for k, v in attrDict.items(): setattr(self, k, v) return class ChampionshipBatPlayer(): ## Õù°ÔÈüÍæ¼Ò def __init__(self): self.zoneID = 0 self.accID = "" self.playerID = 0 self.playerName = "" self.job = 0 self.lv = 0 self.fightPower = 0 self.realmLV = 0 return def GetString(self): return {"zoneID":self.zoneID, "accID":self.accID, "playerID":self.playerID, "playerName":self.playerName, "job":self.job, "lv":self.lv, "fightPower":self.fightPower, "realmLV":self.realmLV} def SetAttr(self, attrDict): for k, v in attrDict.items(): setattr(self, k, v) return class ChampionshipBattle(): ## Õù°ÔÈü¶ÔÕ½ def __init__(self): self.overTime = 0 # Õ½¶·½áËãʱ¼ä self.zoneID = 0 self.groupMark = 0 # ·Ö×é±êʶ£¬Èç 64 32 16 8 4 2 self.battleNum = 0 # ¶ÔÕ½±àºÅ£¬Èç 1 ~ 32 self.playerIDA = 0 self.playerIDB = 0 self.winPlayerID = 0 # ²»´æµµ self.roomID = 0 self.mapID = 0 self.copyMapID = 0 return def GetString(self): return {"overTime":self.overTime, "zoneID":self.zoneID, "groupMark":self.groupMark, "battleNum":self.battleNum, "playerIDA":self.playerIDA, "playerIDB":self.playerIDB, "winPlayerID":self.winPlayerID} def SetAttr(self, attrDict): for k, v in attrDict.items(): setattr(self, k, v) return class ChampionshipPKZoneMgr(): ## Õù°ÔÈüPK·ÖÇø¹ÜÀí def __init__(self, zoneID): self.zoneID = zoneID self.playerDict = {} # ²ÎÈüÍæ¼Ò {playerID:ChampionshipBatPlayer, ...} self.battleInfo = {} # ·Ö×é¶ÔÕ½ÐÅÏ¢ {·Ö×é±êʶ:{¶ÔÕ½±àºÅ:ChampionshipBattle, ...}, ...} self.guessInfo = {} # ¾º²ÂÐÅÏ¢ {¾º²ÂÀàÐÍ:{¾º²ÂÍæ¼ÒID:[ChampionshipGuess, ...]}, ...} self.supportCountInfo = {} # {¾º²ÂÀàÐÍ:{±»¾º²ÂÍæ¼ÒID:Ö§³ÖÈËÊý, ...}, ...} # ×Ó·þ self.syncGuessPlayerIDInfo = {} # ͬ²½¹ý¾º²ÂÐÅÏ¢µÄÍæ¼ÒID {playerID:tick, ...} return def AddBattle(self, groupMark, battleNum, battle): if groupMark not in self.battleInfo: self.battleInfo[groupMark] = {} battleDict = self.battleInfo[groupMark] battleDict[battleNum] = battle self.battleInfo[groupMark] = battleDict return def GetBattle(self, groupMark, battleNum): battle = None if groupMark in self.battleInfo: battleDict = self.battleInfo[groupMark] if battleNum in battleDict: battle = battleDict[battleNum] if not battle: GameWorld.Log("Î޸ÿç·þÅÅλÕù°ÔÈü¶ÔÕ½³¡´ÎÐÅÏ¢: groupMark=%s,battleNum=%s" % (groupMark, battleNum)) # ²»¿ÉÄÜÖ´ÐеĴúÂ룬·½±ã . ³öÌáʾ´úÂë if False: battle = ChampionshipBattle() return battle def GetBatPlayerIDList(self): return self.playerDict.keys() def GetBatPlayer(self, playerID): batPlayer = None if playerID in self.playerDict: batPlayer = self.playerDict[playerID] if GameWorld.IsCrossServer(): UpdCachePlayerInfo(batPlayer, playerID) # ²»¿ÉÄÜÖ´ÐеĴúÂ룬·½±ã . ³öÌáʾ´úÂë if False: batPlayer = ChampionshipBatPlayer() return batPlayer def GetPlayerGuessList(self, playerID, guessType): ## »ñÈ¡Íæ¼Ò¾º²ÂÁбí if guessType not in self.guessInfo: self.guessInfo[guessType] = {} playerGuessDict = self.guessInfo[guessType] if playerID not in playerGuessDict: playerGuessDict[playerID] = [] return playerGuessDict[playerID] def GetTop8PlayerIDList(self): ## »ñȡǰ8Ç¿Íæ¼ÒIDÁбí top8PlayerIDList = [] preGroupMark = 16 # È¡16ǿս¶·Ê¤Õß battleNumList = self.battleInfo.get(preGroupMark, {}).keys() for battleNum in battleNumList: batObj = self.GetBattle(preGroupMark, battleNum) if not batObj: continue if batObj.overTime and batObj.winPlayerID: top8PlayerIDList.append(batObj.winPlayerID) return top8PlayerIDList def UpdCachePlayerInfo(obj, playerID): ## ¸üÐÂÍæ¼Ò»º´æÐÅÏ¢ # »úÆ÷ÈË if not obj or not hasattr(obj, "playerName"): return if playerID < 10000: if obj.playerName: return obj.accID = "accID%s@robot@s1" % (playerID) obj.playerName = "name%s" % playerID obj.job = random.randint(1, 2) obj.lv = random.randint(200, 300) obj.fightPower = random.randint(100000, 1000000) obj.realmLV = random.randint(10, 20) return curCache = PlayerViewCache.FindViewCache(playerID) if curCache: cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) obj.accID = cacheDict.get("AccID", obj.accID) obj.playerName = cacheDict.get("Name", obj.playerName) obj.job = cacheDict.get("Job", obj.job) obj.lv = cacheDict.get("LV", obj.lv) obj.fightPower = cacheDict.get("FightPower", obj.fightPower) obj.realmLV = cacheDict.get("RealmLV", obj.realmLV) return class ChampionshipMgr(): ## Õù°ÔÈü¹ÜÀí def __init__(self): '''×¢ÒâÇø·Ö¿ç·þÆ¥Åä·ÖÇø¡¢ÅÅλ·ÖÇø¡¢ÏɹٷÖÇø£¬ÈýÕß²»Ò»Ñù Æ¥Åä·ÖÇø£ºµ±Ç°½øÐÐÖеĿç·þÆ¥ÅäPK·ÖÇø CrossRealmPK ÅÅλ·ÖÇø£ºÈ¡ÉÏÒ»Èü¼¾µÄ¿ç·þÆ¥ÅäPK·ÖÇøÅÅÃûǰ64×÷ΪPK·ÖÇø£¬¿ÉÄÜÓ뵱ǰ½øÐÐÖеĿç·þPK·ÖÇø²»Ò»Ñù ÏɹٷÖÇø£ºÓÉÅÅλ·ÖÇøPK¾ö³öµÄ½á¹û×öΪÏɹٷÖÇø£¬¿ÉÄÜÓ뵱ǰ½øÐÐÖеÄÅÅλPK·ÖÇø²»Ò»Ñù ''' self._pkZoneInfo = {} # ÅÅλ¶ÔÕ½·ÖÇø {zoneID:ChampionshipZoneMgr, ...} self._officialZoneInfo = {} # ÏɹٷÖÇø {zoneID:ChampionshipOfficialZoneMgr, ...} return def ClearPKZone(self): self._pkZoneInfo = {} return def GetChampPKZoneIDList(self): return self._pkZoneInfo.keys() def GetChampPKZoneMgr(self, zoneID, addNew=False): pkZoneMgr = None if zoneID in self._pkZoneInfo: pkZoneMgr = self._pkZoneInfo[zoneID] elif addNew: pkZoneMgr = ChampionshipPKZoneMgr(zoneID) self._pkZoneInfo[zoneID] = pkZoneMgr if not pkZoneMgr: GameWorld.ErrLog("ÕÒ²»µ½¿ç·þÅÅλÈü·ÖÇø¹ÜÀí! zoneID=%s" % zoneID) return pkZoneMgr def GetPlayerPKZoneID(self, playerID): ## »ñÈ¡Íæ¼ÒÅÅÎ»Íæ·¨ËùÊô·ÖÇø - ×Ó·þרÓà # @return: Èç¹ûÔÚÅÅλÖÐÔò·µ»ØËùÔÚÅÅλ·ÖÇø£¬·ñÔò·µ»Øµ±Ç°·þÎñÆ÷ËùÔÚ¿ç·þÆ¥ÅäPK·ÖÇø for zoneID in self._pkZoneInfo.keys(): pkZoneMgr = self.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: continue if playerID in pkZoneMgr.GetBatPlayerIDList(): return zoneID return GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID) ##============================================================================================= def ClearOfficialZone(self): self._officialZoneInfo = {} return def GetChampOfficialZoneIDList(self): return self._officialZoneInfo.keys() def GetChampOfficialZoneMgr(self, zoneID): if zoneID in self._officialZoneInfo: offZoneMgr = self._officialZoneInfo[zoneID] else: offZoneMgr = ChampionshipOfficialZoneMgr(zoneID) self._officialZoneInfo[zoneID] = offZoneMgr return offZoneMgr def GetPlayerOfficialZoneID(self, playerID): ## »ñÈ¡Íæ¼ÒÅÅÎ»Íæ·¨ËùÊô·ÖÇø - ×Ó·þרÓà # @return: Èç¹ûÔÚ·ÖÇøÈÎÖ°ÖÐÔò·µ»ØËùÔÚÅÅλ·ÖÇø£¬·ñÔò·µ»Øµ±Ç°·þÎñÆ÷ËùÔÚ¿ç·þÆ¥ÅäPK·ÖÇø for zoneID in self._officialZoneInfo.keys(): offZoneMgr = self.GetChampOfficialZoneMgr(zoneID) if offZoneMgr.GetPlayerOfficial(playerID): return zoneID return GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID) def GetChampionshipMgr(): mgr = PyGameData.g_championshipMgr if mgr == None: mgr = ChampionshipMgr() PyGameData.g_championshipMgr = mgr return mgr def OnServerStart(): if not GameWorld.IsCrossServer(): return champMgr = GetChampionshipMgr() universalRecMgr = GameWorld.GetUniversalRecMgr() groupRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipGroup) GameWorld.Log("¼ÓÔØ¿ç·þÅÅÎ»Íæ¼Ò·Ö×é¼Ç¼! %s" % groupRecDataList.Count()) groupMarkList = ShareDefine.CrossChampionshipEnterStateInfo.values() for index in xrange(groupRecDataList.Count()): recData = groupRecDataList.At(index) overTime = recData.GetTime() zoneID = recData.GetValue1() groupInfo = recData.GetValue2() playerIDA = recData.GetValue3() playerIDB = recData.GetValue4() winPlayerID = recData.GetValue5() #if not playerIDA and not playerIDB: # continue groupMark = groupInfo / 100 battleNum = groupInfo % 100 pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) if groupMark in groupMarkList and battleNum: battle = ChampionshipBattle() battle.overTime = overTime battle.zoneID = zoneID battle.groupMark = groupMark battle.battleNum = battleNum battle.playerIDA = playerIDA battle.playerIDB = playerIDB battle.winPlayerID = winPlayerID pkZoneMgr.AddBattle(groupMark, battleNum, battle) GameWorld.Log("·Ö×éÍæ¼Ò: zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s,playerIDB=%s,winPlayerID=%s" % (zoneID, groupMark, battleNum, playerIDA, playerIDB, winPlayerID)) # ·Ç·Ö×éÊý¾ÝΪ²ÎÈüÍæ¼ÒÊý¾Ý elif playerIDA: playerID = playerIDA batPlayer = ChampionshipBatPlayer() batPlayer.zoneID = zoneID batPlayer.playerID = playerID pkZoneMgr.playerDict[playerID] = batPlayer GameWorld.Log("²ÎÈüÍæ¼Ò: zoneID=%s,playerID=%s" % (zoneID, playerID)) guessRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipGuess) GameWorld.Log("¼ÓÔØ¿ç·þÅÅÎ»Íæ¼Ò¾º²Â¼Ç¼! %s" % guessRecDataList.Count()) for index in xrange(guessRecDataList.Count()): recData = guessRecDataList.At(index) zoneID = recData.GetValue1() guessInfo = recData.GetValue2() guessType = guessInfo / 100 guessRank = guessInfo % 100 guessPlayerID = recData.GetValue3() tagPlayerID = recData.GetValue4() moneyTotal = recData.GetValue5() isClose = GameWorld.ToIntDef(recData.GetStrValue1(), 0) pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: continue playerGuessList = pkZoneMgr.GetPlayerGuessList(guessPlayerID, guessType) guessObj = ChampionshipGuess() guessObj.zoneID = zoneID guessObj.guessType = guessType guessObj.guessRank = guessRank guessObj.guessPlayerID = guessPlayerID guessObj.tagPlayerID = tagPlayerID guessObj.moneyTotal = moneyTotal guessObj.isClose = isClose playerGuessList.append(guessObj) if guessType not in pkZoneMgr.supportCountInfo: pkZoneMgr.supportCountInfo[guessType] = {} playerSupportCountDict = pkZoneMgr.supportCountInfo[guessType] playerSupportCountDict[tagPlayerID] = playerSupportCountDict.get(tagPlayerID, 0) + 1 officialRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipOfficial) GameWorld.Log("¼ÓÔØ¿ç·þÅÅÎ»Íæ¼Ò¹ÙÖ°ÐÅÏ¢! %s" % officialRecDataList.Count()) for index in xrange(officialRecDataList.Count()): recData = officialRecDataList.At(index) lastDismissJuniorTime = recData.GetTime() value1 = recData.GetValue1() officialID = value1 / 10 zoneID = value1 % 10 playerID = recData.GetValue2() worshipValue = recData.GetValue3() worshipCount = worshipValue / 10 worshipDouble = worshipValue % 10 rank = recData.GetValue4() strValue3 = recData.GetStrValue3() try: applyPlayerIDList = eval(strValue3) if strValue3 else [] except: applyPlayerIDList = [] offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) offObj = ChampionshipOfficial() offObj.zoneID = zoneID offObj.officialID = officialID offObj.lastDismissJuniorTime = lastDismissJuniorTime offObj.playerID = playerID offObj.worshipCount = worshipCount offObj.worshipDouble = worshipDouble offObj.rank = rank offObj.applyPlayerInfo = {applyPlayerID:{} for applyPlayerID in applyPlayerIDList} offZoneMgr.officialInfo[officialID] = offObj GameWorld.Log(" zoneID=%s,officialID=%s,playerID=%s,rank=%s" % (zoneID, officialID, playerID, rank)) challengeRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipOffChallenge) GameWorld.Log("¼ÓÔØ¿ç·þÅÅλ¹ÙÖ°ÌôÕ½¼Ç¼ÐÅÏ¢! %s" % challengeRecDataList.Count()) for index in xrange(challengeRecDataList.Count()): recData = challengeRecDataList.At(index) value1 = recData.GetValue1() officialID = value1 / 10 zoneID = value1 % 10 strValue3 = recData.GetStrValue3() if not strValue3: continue try: challengeDict = eval(strValue3) except: continue offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) offObj = offZoneMgr.GetOfficialObj(officialID) if not offObj: continue offObj.challengeList.append(challengeDict) #GameWorld.Log(" zoneID=%s,officialID=%s,ÌôÕ½¼Ç¼=%s" % (zoneID, officialID, challengeDict)) return def OnServerClose(): SaveChampionshipData() return def SaveChampionshipData(): if not GameWorld.IsCrossServer(): return champMgr = GetChampionshipMgr() universalRecMgr = GameWorld.GetUniversalRecMgr() pkZoneIDList = champMgr.GetChampPKZoneIDList() GameWorld.Log("±£´æ¿ç·þÅÅÎ»Íæ¼Ò·Ö×é¼Ç¼! pkZoneIDList=%s" % pkZoneIDList) universalRecMgr.Delete(Def_RecType_CrossChampionshipGroup) groupRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipGroup) for zoneID in pkZoneIDList: pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: continue # ±£´æ²ÎÈüÍæ¼ÒÃûµ¥ batPlayerIDList = pkZoneMgr.GetBatPlayerIDList() GameWorld.Log(" zoneID=%s,batPlayerIDCount=%s, %s" % (zoneID, len(batPlayerIDList), batPlayerIDList)) for playerID in batPlayerIDList: recData = groupRecDataList.AddRec() recData.SetValue1(zoneID) recData.SetValue2(0) # ÎÞ·Ö×éÍæ¼Ò£¬´ú±í²ÎÈüÍæ¼Ò·Ö×éÐÅÏ¢´æ0 recData.SetValue3(playerID) # ±£´æ·Ö×é¼Ç¼ GameWorld.Log(" zoneID=%s,battleInfoKey=%s" % (zoneID, pkZoneMgr.battleInfo.keys())) for groupMark, groupDict in pkZoneMgr.battleInfo.items(): GameWorld.Log(" zoneID=%s,groupMark=%s,count=%s" % (zoneID, groupMark, len(groupDict))) for battleNum, batObj in groupDict.items(): groupInfo = groupMark * 100 + battleNum # ·Ö×é±êʶ*100+¶ÔÕ½±àºÅ recData = groupRecDataList.AddRec() recData.SetTime(batObj.overTime) recData.SetValue1(zoneID) recData.SetValue2(groupInfo) # ÎÞ·Ö×éÍæ¼Ò£¬´ú±í²ÎÈüÍæ¼Ò·Ö×éÐÅÏ¢´æ0 recData.SetValue3(batObj.playerIDA) recData.SetValue4(batObj.playerIDB) recData.SetValue5(batObj.winPlayerID) GameWorld.Log("±£´æ¿ç·þÅÅÎ»Íæ¼Ò¾º²Â¼Ç¼!") universalRecMgr.Delete(Def_RecType_CrossChampionshipGuess) guessRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipGuess) for zoneID in pkZoneIDList: pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: continue for guessType, playerGuessDict in pkZoneMgr.guessInfo.items(): for guessPlayerID, guessObjList in playerGuessDict.items(): #GameWorld.Log(" zoneID=%s,guessType=%s,guessPlayerID=%s,guessCount=%s" % (zoneID, guessType, guessPlayerID, len(guessObjList))) for guessObj in guessObjList: recData = guessRecDataList.AddRec() recData.SetValue1(zoneID) recData.SetValue2(guessType * 100 + guessObj.guessRank) recData.SetValue3(guessPlayerID) recData.SetValue4(guessObj.tagPlayerID) recData.SetValue5(guessObj.moneyTotal) recData.SetStrValue1("%s" % guessObj.isClose) offZoneIDList = champMgr.GetChampOfficialZoneIDList() GameWorld.Log("±£´æ¿ç·þÅÅÎ»Íæ¼Ò¹ÙÖ°ÐÅÏ¢! offZoneIDList=%s" % offZoneIDList) universalRecMgr.Delete(Def_RecType_CrossChampionshipOfficial) officialRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipOfficial) universalRecMgr.Delete(Def_RecType_CrossChampionshipOffChallenge) challengeRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipOffChallenge) for zoneID in offZoneIDList: offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) #GameWorld.Log(" zoneID=%s,officialInfoKey=%s" % (zoneID, offZoneMgr.officialInfo.keys())) for officialID in offZoneMgr.officialInfo.keys(): offObj = offZoneMgr.GetOfficialObj(officialID) if not offObj: continue value1 = offObj.officialID * 10 + zoneID recData = officialRecDataList.AddRec() recData.SetTime(offObj.lastDismissJuniorTime) recData.SetValue1(value1) recData.SetValue2(offObj.playerID) recData.SetValue3(offObj.worshipCount * 10 + offObj.worshipDouble) recData.SetValue4(offObj.rank) strValue3 = "%s" % offObj.applyPlayerInfo.keys() strValue3 = strValue3.replace(" ", "") recData.SetStrValue3(strValue3) #GameWorld.Log(" zoneID=%s,officialID=%s,playerID=%s,rank=%s,challengeCount=%s" # % (zoneID, officialID, offObj.playerID, offObj.rank, len(offObj.challengeList))) for challengeDict in offObj.challengeList: challRecData = challengeRecDataList.AddRec() challRecData.SetValue1(value1) strValue3 = str(challengeDict) strValue3 = strValue3.replace(" ", "") challRecData.SetStrValue3(strValue3) return def DoOnDay(): if not GameWorld.IsCrossServer(): return dailyOfficialInfo = {} champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampOfficialZoneIDList(): offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) for officialID in offZoneMgr.officialInfo.keys(): offObj = offZoneMgr.GetOfficialObj(officialID) if not offObj: continue if not offObj.playerID: continue dailyOfficialInfo[offObj.playerID] = officialID if dailyOfficialInfo: serverGroupIDList = [] CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipDailyOfficial, dailyOfficialInfo, serverGroupIDList) return def DoOnDayEx(): if not GameWorld.IsCrossServer(): return champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampOfficialZoneIDList(): syncOfficialIDList = [] mainOfficialList = [] # ½öÖ÷Ïɹٿɱ»Ä¤°Ý offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) for officialID in offZoneMgr.officialInfo.keys(): offObj = offZoneMgr.GetOfficialObj(officialID) if not offObj: continue if not offObj.playerID: continue if offObj.worshipDouble: offObj.worshipDouble = 0 # ÖØÖÃÿÈÕË«±¶Ä¤°Ý syncOfficialIDList.append(officialID) GameWorld.Log("ÖØÖýñÈÕË«±¶Ä¤°ÝÌØÈ¨ÏɹÙ: zoneID=%s,officialID=%s,playerID=%s" % (zoneID, officialID, offObj.playerID), zoneID) mainIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", officialID) if mainIpyData and mainIpyData.GetJuniorOfficialIDList(): mainOfficialList.append(offObj) if mainOfficialList: offObj = random.choice(mainOfficialList) officialID = offObj.officialID offObj.worshipDouble = 1 # Ëæ»úij¸öÏɹٻñµÃ½ñÈÕË«±¶ÌØÈ¨ GameWorld.Log("Ëæ»ú½ñÈÕË«±¶Ä¤°ÝÌØÈ¨ÏɹÙ: zoneID=%s,officialID=%s,playerID=%s" % (zoneID, officialID, offObj.playerID), zoneID) if officialID not in syncOfficialIDList: syncOfficialIDList.append(officialID) if syncOfficialIDList: Send_CrossServerMsg_ChampionshipOfficial(zoneID, syncOfficialIDList) return def IsChampionshipPlayer(playerID): ## ÊÇ·ñÅÅλÈüÏà¹ØÍæ¼Ò champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampPKZoneIDList(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: continue if playerID in pkZoneMgr.GetBatPlayerIDList(): # ÊDzÎÈüÍæ¼Ò return True for zoneID in champMgr.GetChampOfficialZoneIDList(): offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) for offObj in offZoneMgr.officialInfo.values(): if playerID == offObj.playerID: # ÊÇÏɹ٠return True if playerID in offObj.applyPlayerInfo: # ÉêÇëÏɹÙÖÐ return True return False def CrossServerMsg_ChampionshipDailyOfficial(msgData): ## ÊÕµ½¿ç·þ·þÎñÆ÷ÐÅÏ¢ - ÿÈÕ¹Ù¾ôÍæ¼ÒÐÅÏ¢ for playerID, officialID in msgData.items(): if not PlayerControl.GetDBPlayerAccIDByID(playerID): # ·Ç±¾·þÍæ¼Ò continue ipyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", officialID) if not ipyData: continue awardItemList = ipyData.GetDailyAwardItemList() if not awardItemList: continue paramList = [officialID] PlayerCompensation.SendMailByKey("CrossChampionshipOfficialDaily", [playerID], awardItemList, paramList) return def DoChampionshipOpen(curPlayer): NotifyPlayerChampionshipInfo(curPlayer, GameWorld.GetGameWorld().GetTick()) return def OnPlayerLogin(curPlayer, tick): if GameWorld.IsCrossServer(): return if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): return NotifyPlayerChampionshipInfo(curPlayer, tick) return def NotifyPlayerChampionshipInfo(curPlayer, tick): playerID = curPlayer.GetPlayerID() champMgr = GetChampionshipMgr() pkZoneIDList = champMgr.GetChampPKZoneIDList() for zoneID in pkZoneIDList: Sync_ChampionshipPKZoneGroupInfo(zoneID, curPlayer=curPlayer) for zoneID in champMgr.GetChampOfficialZoneIDList(): Sync_ChampionshipOfficialInfo(zoneID, curPlayer=curPlayer) if pkZoneIDList: playerZoneID = champMgr.GetPlayerPKZoneID(playerID) pkZoneMgr = champMgr.GetChampPKZoneMgr(playerZoneID) if not pkZoneMgr: return if playerID not in pkZoneMgr.syncGuessPlayerIDInfo: sendMsg = {"zoneID":playerZoneID, "playerID":playerID, "exDataType":"ChampionshipGuessQuery"} CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChampionshipGuess, sendMsg) else: Sync_ChampionshipGuessPriInfo(curPlayer) Sync_ChampionshipGuessPubInfo(playerZoneID, curPlayer) return def ChampionshipErrorDo(): ## ״̬Òì³£ºó´¦Àí stateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError) if not stateError: return "state is not error." if PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipErrorDo): return "already done." champMgr = GetChampionshipMgr() # ·µ»¹Î´½áËãµÄ¾º²ÂÏûºÄ moneyType, _ = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 1) moneyItemID = ChConfig.MoneyItemIDDict.get(moneyType) for zoneID in champMgr.GetChampPKZoneIDList(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: continue backGuessTypeList = [] playerGuessMoneyInfo = {} for guessType, playerGuessDict in pkZoneMgr.guessInfo.items(): for guessPlayerID, guessObjList in playerGuessDict.items(): for guessObj in guessObjList: if guessObj.isClose: # ÒѾ­½áËãµÄ²»´¦Àí continue guessObj.isClose = 1 if guessType not in backGuessTypeList: backGuessTypeList.append(guessType) playerGuessMoneyInfo[guessPlayerID] = playerGuessMoneyInfo.get(guessPlayerID, 0) + guessObj.moneyTotal GameWorld.Log("¾º²ÂÐèÒª·µ»¹Íæ¼ÒÐÅÏ¢: moneyItemID=%s,zoneID=%s,backGuessTypeList=%s, %s" % (moneyItemID, zoneID, backGuessTypeList, playerGuessMoneyInfo)) if not moneyItemID or not playerGuessMoneyInfo: continue for guessPlayerID, totalMoney in playerGuessMoneyInfo.items(): paramList = [] addItemList = [[moneyItemID, totalMoney, 0]] PlayerCompensation.SendMailByKey("CrossChampionshipGuessBack", [guessPlayerID], addItemList, paramList, crossMail=True) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipErrorDo, 1) return "OK" def OnMinuteProcess(curMinute): if not GameWorld.IsCrossServer(): return Dispose_CrossChampionshipState() # ÿ°ëСʱ´æµµÒ»´Î if curMinute % 30 == 0: SaveChampionshipData() return def __GetChampionshipStartDate(): ## »ñÈ¡ÅÅλÈü¿ªÊ¼ÈÕÆÚ key = "ChampionshipStartDate" openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 loadSign = openServerDay ChampionshipStartDateInfo = IpyGameDataPY.GetConfigEx(key) if ChampionshipStartDateInfo and ChampionshipStartDateInfo[0] == loadSign: GameWorld.DebugLog("ÒѾ­¼ÓÔØ¹ý±¾ÈÕ¿ç·þÅÅλÕù°ÔÈü¿ªÊ¼ÈÕÆÚ£¡loadSign=%s" % loadSign) return False, ChampionshipStartDateInfo[1] ipyDataMgr = IpyGameDataPY.IPY_Data() count = ipyDataMgr.GetChampionshipTimeCount() if count < 2: return True, "" firstIpyData = ipyDataMgr.GetChampionshipTimeByIndex(0) lastIpyData = ipyDataMgr.GetChampionshipTimeByIndex(count - 1) if not firstIpyData or not lastIpyData: return False, "" fristDay, firstHour, firstMinute = firstIpyData.GetStartDay(), firstIpyData.GetStartHour(), firstIpyData.GetStartMinute() lastDay, lastHour, lastMinute = lastIpyData.GetEndDay(), lastIpyData.GetEndHour(), lastIpyData.GetEndMinute() startSeconds = ((fristDay - 1) * 24 + firstHour) * 3600 + firstMinute * 60 endSeconds = ((lastDay - 1) * 24 + lastHour) * 3600 + lastMinute * 60 curDateTime = GameWorld.GetServerTime() GameWorld.Log("===== ¼ÓÔØ½ñÌì¿ç·þÅÅλÕù°ÔÈüʱ¼ä =====") CrossChamDateList = IpyGameDataPY.GetFuncEvalCfg("CrossChamFB", 1) GameWorld.Log("¿ªÆôÈÕÆÚÁбí: %s" % CrossChamDateList) GameWorld.Log("fristDay=%s,firstHour=%s,firstMinute=%s,startSeconds=%s" % (fristDay, firstHour, firstMinute, startSeconds)) GameWorld.Log("lastDay=%s,lastHour=%s,lastMinute=%s,endSeconds=%s" % (lastDay, lastHour, lastMinute, endSeconds)) nowStartDate = "" for startDate in CrossChamDateList: startDateTime0 = datetime.datetime.strptime(startDate, ChConfig.TYPE_Time_YmdFormat) # ¿ªÊ¼ÈÕÆÚ0µã startDateTime = startDateTime0 + datetime.timedelta(seconds=startSeconds) endDateTime = startDateTime0 + datetime.timedelta(seconds=endSeconds) if curDateTime >= startDateTime and curDateTime <= endDateTime: nowStartDate = startDate # È«²¿±éÀúÍ꣬ÒÔ×îеÄÂú×ãÌõ¼þʱ¼äΪ׼ GameWorld.Log("nowStartDate=%s" % nowStartDate) ChampionshipStartDateInfo = IpyGameDataPY.SetConfigEx(key, [loadSign, nowStartDate]) GameWorld.Log("¿ç·þÅÅλÕù°ÔÈü¿ªÊ¼ÈÕÆÚ¼ÓÔØÍê±Ï! loadSign=%s,nowStartDate=%s" % (loadSign, nowStartDate)) GameWorld.Log("=============================================================") return True, ChampionshipStartDateInfo[1] def Dispose_CrossChampionshipState(reloadRefresh=False): isReload, startDate = __GetChampionshipStartDate() isReload = isReload or reloadRefresh gameWorld = GameWorld.GetGameWorld() # ´Ë»î¶¯Ñϸñ°´ÕÕÁ÷³Ì״̬һ¸ö¸öÀ´£¬²»ÄÜÌø£¬ËùÒÔʹÓÃdb±£´æ×´Ì¬£¬·ÀÖ¹ÁÙʱά»¤µ¼ÖÂ״̬Ϊ0 befState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState) dbCrossChampionshipID = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID) stateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError) updState = 0 crossChampionshipID = dbCrossChampionshipID # ÕâÀïʱ¼äÐ辫ȷµ½·ÖÖÓ£¬²»È»ºóÃæµÄ±È½Ï»áÆ¥Åä²»µ½ curDateTime = GameWorld.GetServerTime() curDateTime = datetime.datetime.strptime("%d-%d-%d %d:%d:00" % (curDateTime.year, curDateTime.month, curDateTime.day, curDateTime.hour, curDateTime.minute), ChConfig.TYPE_Time_Format) serverGroupIDList = [] # È«·þͳһÂß¼­ if startDate: crossChampionshipID = GameWorld.ChangeTimeStrToNum(startDate, ChConfig.TYPE_Time_YmdFormat) startDateTime0 = datetime.datetime.strptime(startDate, ChConfig.TYPE_Time_YmdFormat) # ¿ªÊ¼ÈÕÆÚ0µã ipyDataMgr = IpyGameDataPY.IPY_Data() for index in xrange(ipyDataMgr.GetChampionshipTimeCount()): timeIpyData = ipyDataMgr.GetChampionshipTimeByIndex(index) #dataID = timeIpyData.GetID() startDay, startHour, startMinute = timeIpyData.GetStartDay(), timeIpyData.GetStartHour(), timeIpyData.GetStartMinute() endDay, endHour, endMinute = timeIpyData.GetEndDay(), timeIpyData.GetEndHour(), timeIpyData.GetEndMinute() startSeconds = ((startDay - 1) * 24 + startHour) * 3600 + startMinute * 60 endSeconds = ((endDay - 1) * 24 + endHour) * 3600 + endMinute * 60 startDateTime = startDateTime0 + datetime.timedelta(seconds=startSeconds) endDateTime = startDateTime0 + datetime.timedelta(seconds=endSeconds) if curDateTime < startDateTime or curDateTime > endDateTime: continue updState = timeIpyData.GetStateValue() notifyInfoDict = timeIpyData.GetNotifyInfo() if not stateError and notifyInfoDict: diffDateTime = curDateTime - startDateTime diffMinute = (diffDateTime.days * 24 * 3600 + diffDateTime.seconds) / 60 # µ±Ç°Ê±¼äÓ뿪ʼʱ¼äÏà²î·ÖÖÓÊý GameWorld.DebugLog(" ¹ã²¥ÅжÏ: curDateTime=%s,startDateTime=%s,diffDays=%s,diffSeconds=%s,diffMinute=%s" % (curDateTime, startDateTime, diffDateTime.days, diffDateTime.seconds, diffMinute)) if diffMinute in notifyInfoDict: notifyKey, paramList = notifyInfoDict[diffMinute] PlayerControl.WorldNotifyCross(serverGroupIDList, 0, notifyKey, paramList) break if not isReload and befState == updState: #ÒѾ­ÊÇÕâ¸ö״̬ÁË return GameWorld.Log("¿ç·þÅÅλÕù°ÔÈü״̬±ä¸ü: befState=%s,updState=%s,stateError=%s" % (befState, updState, stateError)) # ÅÐ¶Ï»î¶¯ÖØÖ㬸ûֻ¿¼ÂÇÕý³£Á÷³Ì״̬£¬ÈκÎÁ÷³ÌÌø¹ýµÄ¶¼²»´¦Àí£»Òì³£Çé¿öά»¤·þÎñÆ÷µ¼ÖÂÌø¹ýÁ÷³ÌµÄ¿ÉÅäÖÃÐÂÈÕÆÚ¿ªÊ¼Ð»£¬²¢×ö²¹³¥ GameWorld.Log("crossChampionshipID=%s,dbCrossChampionshipID=%s" % (crossChampionshipID, dbCrossChampionshipID)) gameWorld.SetDict(PlayerDBGSEvent.Def_CrossChampionshipState, updState) gameWorld.SetDict(PlayerDBGSEvent.Def_CrossChampionshipID, crossChampionshipID) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID, crossChampionshipID) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState, updState) isNewStart = False if crossChampionshipID != dbCrossChampionshipID: # л - ±ØÐë´ÓµÚÒ»¸ö״̬¿ªÊ¼²ÅËã if crossChampionshipID: if updState == ShareDefine.CrossChampionshipStateList[0]: isNewStart = True DoCrossChampionshipStart(crossChampionshipID, updState) else: GameWorld.ErrLog("¿ç·þÅÅλÕù°ÔÈüÖØÖûʱ·ÇÊ׸ö״̬£¬Òì³£²»´¦Àí: crossChampionshipID=%s,dbCrossChampionshipID=%s,updState=%s" % (crossChampionshipID, dbCrossChampionshipID, updState)) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError, 1) # ·Ç¿ªÆôÐÂÅÅλ»î¶¯µÄ£¬ÓÅÏÈͳһ¹ã²¥×Ó·þ״̬£¬ÔÙ×öºóÐø´¦Àí if not isNewStart: Send_CrossServerMsg_ChampionshipState() if isNewStart: pass elif not crossChampionshipID: GameWorld.Log("¿ç·þÅÅλÕù°ÔÈü·Ç»î¶¯ÖУ¬²»´¦Àí!") elif stateError: GameWorld.ErrLog("¿ç·þÅÅλÕù°ÔÈü»î¶¯×´Ì¬ÒѾ­Òì³££¬²»´¦Àí!") elif crossChampionshipID == dbCrossChampionshipID: if befState == updState: GameWorld.Log("¿ç·þÅÅλÕù°ÔÈü״̬²»±ä²»´¦Àí: befState=%s,updState=%s" % (befState, updState)) elif befState and befState in ShareDefine.CrossChampionshipStateList \ and updState and updState in ShareDefine.CrossChampionshipStateList: befStateIndex = ShareDefine.CrossChampionshipStateList.index(befState) updStateIndex = ShareDefine.CrossChampionshipStateList.index(updState) # ¸Ã»î¶¯±ØÐ밴״̬Á÷³ÌÒ»¸ö¸öÀ´£¬´æDBµÄÈ·±£Ã¿¸ö״ֵ̬Âß¼­´¦ÀíÖ»»á´¥·¢Ò»´Î if befStateIndex + 1 == updStateIndex: if updState == ShareDefine.CrossChampionshipState_Group64: DoCrossChampionshipGroupRand(64) elif updState == ShareDefine.CrossChampionshipState_Group32: DoCrossChampionshipGroupRand(32) elif updState == ShareDefine.CrossChampionshipState_Group16: DoCrossChampionshipGroupRand(16) elif updState == ShareDefine.CrossChampionshipState_Guess4: DoCrossChampionshipTopPlayer8() elif updState == ShareDefine.CrossChampionshipState_Group8: DoCrossChampionshipGroupRand(8) elif updState == ShareDefine.CrossChampionshipState_GroupSemi: DoCrossChampionshipGroupByWF(4) elif updState == ShareDefine.CrossChampionshipState_GroupFinal: DoCrossChampionshipGroupByWF(2) # ´¦Àí½ø³¡×´Ì¬ elif updState in ShareDefine.CrossChampionshipEnterStateInfo: DoCrossChampionshipStartEnter(updState) else: GameWorld.ErrLog("¿ç·þÅÅλÕù°ÔÈü״̬Á÷³ÌÒì³£: befState=%s,updState=%s,befStateIndex=%s,updStateIndex=%s" % (befState, updState, befStateIndex, updStateIndex)) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError, 1) Send_CrossServerMsg_ChampionshipState() # ´Ó×îºóÒ»¸ö״̬µ½0£¬´ú±íÕû¸öÁ÷³Ì½áÊø£¬ÐèÒª´¦ÀíϽáËã elif befState == ShareDefine.CrossChampionshipStateList[-1] and not updState: DoCrossChampionshipFinalOver() else: GameWorld.ErrLog("¿ç·þÅÅλÕù°ÔÈü״̬Òì³£: updState=%s" % updState) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError, 1) Send_CrossServerMsg_ChampionshipState() return def DoCrossChampionshipStart(crossChampionshipID, updState): ## л¿ªÊ¼ GameWorld.Log("=== ¿ç·þÅÅλÕù°ÔÈüл¿ªÊ¼ ===") GameWorld.Log("crossChampionshipID=%s,updState=%s" % (crossChampionshipID, updState)) hisZoneIDList = [] # ÒòΪ·ÖÇø¿ÉÄܵ÷ÕûÔöɾ£¬ÕâÀïҪȡÀúÊ·ÅäÖùýµÄËùÓзÖÇø championshipSeason = 0 # ÅÅλÈüÊý¾ÝÈ¡·Ç»î¶¯ÖеÄ×î¸ßÈü¼¾ crossZoneName = GameWorld.GetCrossZoneName() ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetCrossRealmPKSeasonCount()): seasonIpyData = ipyDataMgr.GetCrossRealmPKSeasonByIndex(index) if crossZoneName != seasonIpyData.GetCrossZoneName(): continue zoneID = seasonIpyData.GetZoneID() if zoneID not in hisZoneIDList: hisZoneIDList.append(zoneID) gameWorld = GameWorld.GetGameWorld() for zoneID in hisZoneIDList: seasonID = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonID % zoneID) seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID) if seasonState == 1: checkSeason = seasonID - 1 # Èü¼¾ÖеÄÈ¡ÉÏÒ»¸öÈü¼¾ else: checkSeason = seasonID if championshipSeason < checkSeason: championshipSeason = checkSeason GameWorld.Log("hisZoneIDList=%s,championshipSeason=%s" % (hisZoneIDList, championshipSeason)) # Çå¿ÕÉϴλ¼Ç¼ universalRecMgr = GameWorld.GetUniversalRecMgr() universalRecMgr.Delete(Def_RecType_CrossChampionshipGroup) universalRecMgr.Delete(Def_RecType_CrossChampionshipGuess) universalRecMgr.Delete(Def_RecType_CrossChampionshipOfficial) universalRecMgr.Delete(Def_RecType_CrossChampionshipOffChallenge) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID, crossChampionshipID) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState, updState) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError, 0) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipErrorDo, 0) champMgr = GetChampionshipMgr() champMgr.ClearPKZone() # ½öÇåÀíPK·ÖÇøÐÅÏ¢£¬ÏɹÙÐÅÏ¢²»±ä # Éú³É²ÎÈüÍæ¼ÒÃûµ¥: È¡¿ç·þPKËùÓзÖÇø championshipSeason Èü¼¾µÄÊý¾Ý if championshipSeason: crossPKBillboardMgr = PyDataManager.GetCrossPKBillboardManager() for zoneID in hisZoneIDList: billboardList = crossPKBillboardMgr.GetCrossPKBillboardInfo(zoneID, championshipSeason)[0] GameWorld.Log("zoneID=%s,billboardListLen=%s" % (zoneID, len(billboardList))) if not billboardList: # ûÓÐÍæ¼ÒÉϰñµÄ²»´¦Àí continue pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) battlePlayerList = billboardList[:Def_CrossChampionshipPlayerMax] for num, billboardData in enumerate(battlePlayerList, 1): playerID = billboardData.PlayerID batPlayer = ChampionshipBatPlayer() batPlayer.zoneID = zoneID batPlayer.playerID = playerID batPlayer.playerName = billboardData.PlayerName batPlayer.job = billboardData.Job batPlayer.fightPower = billboardData.FightPower batPlayer.realmLV = billboardData.RealmLV pkZoneMgr.playerDict[playerID] = batPlayer getPlayer = pkZoneMgr.GetBatPlayer(playerID) dataDict = {"zoneID":zoneID, "playerID":playerID, "accID":getPlayer.accID, "fightPower":getPlayer.fightPower} DR_CrossChampionshipPK("StartPlayer", dataDict) GameWorld.Log(" AddBattlePlayer num=%s,playerID=%s,accID=%s,fightPower=%s" % (num, playerID, getPlayer.accID, getPlayer.fightPower)) GameWorld.Log("=============================================================") Send_CrossServerMsg_ChampionshipState(newAct=True) Send_CrossServerMsg_ChampionshipPlayer(isSync=True) return def DoCrossChampionshipGroupRand(groupMark): ## Ëæ»úÁ½Á½·Ö×é battleCount = int(groupMark / 2) # ¶ÔÕ½×éÊý preGroupMark = 0 if groupMark == 64 else groupMark * 2 # ÉÏÒ»ÂÖ·Ö×é±êʶ GameWorld.Log("=== ¿ç·þÅÅλÕù°ÔÈüËæ»ú·Ö×é === groupMark=%s,battleCount=%s,preGroupMark=%s" % (groupMark, battleCount, preGroupMark)) syncPlayerIDList = [] champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampPKZoneIDList(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: continue # Ê×ÂÖÈ¡ËùÓвÎÈüÍæ¼Ò if preGroupMark == 0: batPlayerIDList = pkZoneMgr.GetBatPlayerIDList() # È¡ÉÏÒ»ÂÖ»ñʤÕß else: batPlayerIDList = [] battleNumList = pkZoneMgr.battleInfo.get(preGroupMark, {}).keys() for battleNum in battleNumList: batObj = pkZoneMgr.GetBattle(preGroupMark, battleNum) if not batObj: continue # Èç¹ûÉÏÒ»ÂÖÕ½¶·Ã»½áË㣬ÔòÇ¿ÖÆ½áËã if not batObj.overTime: GameWorld.ErrLog("ÉÏÒ»ÂÖÕ½¶·Î´½áË㣬ִÐÐÇ¿ÖÆ½áËã! zoneID=%s,preGroupMark=%s,battleNum=%s,mapID=%s,copyMapID=%s" % (zoneID, preGroupMark, battleNum, batObj.mapID, batObj.copyMapID), batObj.roomID) DoBattleOverLogic(zoneID, preGroupMark, battleNum) if not batObj.winPlayerID: continue if batObj.winPlayerID not in batPlayerIDList: batPlayerIDList.append(batObj.winPlayerID) # ½øÈë¾öÈüµÄËæ»ú·Ö×é£¬Íæ¼Ò²»×ãµÄ²¹0£¬È·±£·Ö×éºó˳ÐòÒ»Ö if groupMark == 8 and len(batPlayerIDList) < Def_CrossChampionshipPlayerWFCount: batPlayerIDList += [0] * (Def_CrossChampionshipPlayerWFCount - len(batPlayerIDList)) batPlayerCount = len(batPlayerIDList) GameWorld.Log("zoneID=%s,batPlayerCount=%s" % (zoneID, batPlayerCount), zoneID) if not batPlayerIDList: continue # ´òÂÒ˳Ðò random.shuffle(batPlayerIDList) GameWorld.Log("batPlayerIDList=%s" % batPlayerIDList) battleDict = {} for num, playerID in enumerate(batPlayerIDList, 1): if playerID and playerID not in syncPlayerIDList: syncPlayerIDList.append(playerID) #batPlayer = zoneMgr.GetBatPlayer(playerID) # 1.ÏÈÈ·±£Ã¿×éÓÐÈË if num <= battleCount: battle = ChampionshipBattle() battle.zoneID = zoneID battle.groupMark = groupMark battle.battleNum = num battle.playerIDA = playerID battleDict[num] = battle pkZoneMgr.battleInfo[groupMark] = battleDict else: battle = pkZoneMgr.GetBattle(groupMark, num - battleCount) # Ò»°ã²»¿ÉÄÜΪNone£¬·ÀһϠif not battle: continue battle.playerIDB = playerID for battleNum in range(1, 1 + battleCount): batObj = pkZoneMgr.GetBattle(groupMark, battleNum) if not batObj: continue playerIDA = batObj.playerIDA playerIDB = batObj.playerIDB playerObjA = pkZoneMgr.GetBatPlayer(playerIDA) playerObjB = pkZoneMgr.GetBatPlayer(playerIDB) accIDA = "" if not playerObjA else playerObjA.accID accIDB = "" if not playerObjB else playerObjB.accID fightPowerA = 0 if not playerObjA else playerObjA.fightPower fightPowerB = 0 if not playerObjB else playerObjB.fightPower GameWorld.Log(" ¶ÔÕ½×éÐÅÏ¢: zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s(%s),playerIDB=%s(%s),fightPowerA=%s,fightPowerB=%s" % (zoneID, batObj.groupMark, batObj.battleNum, playerIDA, accIDA, playerIDB, accIDB, fightPowerA, fightPowerB), zoneID) dataDict = {"zoneID":zoneID, "groupMark":groupMark, "battleNum":battleNum, "playerIDA":playerIDA, "accIDA":accIDA, "fightPowerA":fightPowerA, "playerIDB":playerIDB, "accIDB":accIDB, "fightPowerB":fightPowerB, } DR_CrossChampionshipPK("Group", dataDict) GameWorld.Log("=============================================================") # ¹ã²¥×Ó·þ Send_CrossServerMsg_ChampionshipPlayer(syncPlayerIDList) Send_CrossServerMsg_ChampionshipGroup(groupMark) return def DoCrossChampionshipGroupByWF(groupMark): ## °´Ê¤¸º×é·Ö×飬ÓÉÉÏÒ»ÂÖµÄʤ¸º·Ö×鼰˳Ðò¾ö¶¨±¾ÂִεķÖ×飬ÐèҪȷ±£Ë³ÐòÒ»Ö if groupMark == 4: preGroupMark = 8 elif groupMark == 2: preGroupMark = 4 else: return battleCount = int(Def_CrossChampionshipPlayerWFCount / 2) # ¶ÔÕ½×éÊý£¬Ò²ÊÇʤ¸º×éÿ×éËùÐèÈËÊý GameWorld.Log("=== ¿ç·þÅÅλÕù°ÔÈüʤ¸º·Ö×é === groupMark=%s,battleCount=%s,preGroupMark=%s" % (groupMark, battleCount, preGroupMark)) syncPlayerIDList = [] champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampPKZoneIDList(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: continue winPlayerIDList, losePlayerIDList = [], [] # ʤÕß×é¡¢°ÜÕß×é battleNumList = pkZoneMgr.battleInfo.get(preGroupMark, {}).keys() battleNumList.sort() # ¶ÔÕ½±àºÅ°´Ö®Ç°µÄ·Ö×é˳ÐòÅÅÐò£¬È·±£·Ö×é˳ÐòÒ»Ö for battleNum in battleNumList: batObj = pkZoneMgr.GetBattle(preGroupMark, battleNum) if not batObj: continue # Èç¹ûÉÏÒ»ÂÖÕ½¶·Ã»½áË㣬ÔòÇ¿ÖÆ½áËã if not batObj.overTime: GameWorld.ErrLog("ÉÏÒ»ÂÖÕ½¶·Î´½áË㣬ִÐÐÇ¿ÖÆ½áËã! zoneID=%s,preGroupMark=%s,battleNum=%s,mapID=%s,copyMapID=%s" % (zoneID, preGroupMark, battleNum, batObj.mapID, batObj.copyMapID), batObj.roomID) DoBattleOverLogic(zoneID, preGroupMark, battleNum) # Ϊȷ±£¶àÂִζÔս˳ÐòÒ»Ö£¬µ±ÎÞʤÀûÍæ¼Òʱ£¨Ò»°ãÊÇûÓÐÍæ¼Ò»ò½áËãÒì³£µ¼ÖÂûÓÐʤÕߣ¬Ò»Âɵ±×öÎÞÍæ¼Ò´¦Àí£©£¬ÎÞÍæ¼ÒÐèÒª²¹0£¬È·±£ºóÐøÆ¥Åä·Ö×é˳ÐòÒ»Ö if not batObj.winPlayerID: winPlayerIDList.append(0) losePlayerIDList.append(0) else: winPlayerID = batObj.playerIDA if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDB losePlayerID = batObj.playerIDB if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDA winPlayerIDList.append(winPlayerID) losePlayerIDList.append(losePlayerID) if len(winPlayerIDList) < battleCount: winPlayerIDList += [0] * (battleCount - len(winPlayerIDList)) winPlayerIDList = winPlayerIDList[:battleCount] if len(losePlayerIDList) < battleCount: losePlayerIDList += [0] * (battleCount - len(losePlayerIDList)) losePlayerIDList = losePlayerIDList[:battleCount] GameWorld.Log("zoneID=%s,groupMark=%s,winPlayerIDList=%s,losePlayerIDList=%s" % (zoneID, groupMark, winPlayerIDList, losePlayerIDList), zoneID) battleNum = 0 battleDict = {} batPlayerIDList = winPlayerIDList + losePlayerIDList for i in range(Def_CrossChampionshipPlayerWFCount)[::2]: playerIDA = batPlayerIDList[i] playerIDB = batPlayerIDList[i + 1] battleNum += 1 battle = ChampionshipBattle() battle.zoneID = zoneID battle.groupMark = groupMark battle.battleNum = battleNum battle.playerIDA = playerIDA battle.playerIDB = playerIDB battleDict[battleNum] = battle pkZoneMgr.battleInfo[groupMark] = battleDict if playerIDA and playerIDA not in syncPlayerIDList: syncPlayerIDList.append(playerIDA) if playerIDB and playerIDB not in syncPlayerIDList: syncPlayerIDList.append(playerIDB) playerObjA = pkZoneMgr.GetBatPlayer(playerIDA) playerObjB = pkZoneMgr.GetBatPlayer(playerIDB) accIDA = "" if not playerObjA else playerObjA.accID accIDB = "" if not playerObjB else playerObjB.accID fightPowerA = 0 if not playerObjA else playerObjA.fightPower fightPowerB = 0 if not playerObjB else playerObjB.fightPower GameWorld.Log(" ¶ÔÕ½×éÐÅÏ¢: zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s(%s),playerIDB=%s(%s),fightPowerA=%s,fightPowerB=%s" % (zoneID, groupMark, battleNum, playerIDA, accIDA, playerIDB, accIDB, fightPowerA, fightPowerB), zoneID) dataDict = {"zoneID":zoneID, "groupMark":groupMark, "battleNum":battleNum, "playerIDA":playerIDA, "accIDA":accIDA, "fightPowerA":fightPowerA, "playerIDB":playerIDB, "accIDB":accIDB, "fightPowerB":fightPowerB, } DR_CrossChampionshipPK("Group", dataDict) GameWorld.Log("=============================================================") # ¹ã²¥×Ó·þ Send_CrossServerMsg_ChampionshipPlayer(syncPlayerIDList) Send_CrossServerMsg_ChampionshipGroup(groupMark) return def DoCrossChampionshipTopPlayer8(): ## ²ú³öǰ8Ç¿ preGroupMark = 16 GameWorld.Log("=== ¿ç·þÅÅλÕù°ÔÈü²ú³öǰ8Ç¿ === preGroupMark=%s" % preGroupMark) champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampPKZoneIDList(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: continue battleNumList = pkZoneMgr.battleInfo.get(preGroupMark, {}).keys() battleNumList.sort() # ¶ÔÕ½±àºÅ°´Ö®Ç°µÄ·Ö×é˳ÐòÅÅÐò£¬È·±£·Ö×é˳ÐòÒ»Ö for battleNum in battleNumList: batObj = pkZoneMgr.GetBattle(preGroupMark, battleNum) if not batObj: continue # Èç¹ûÉÏÒ»ÂÖÕ½¶·Ã»½áË㣬ÔòÇ¿ÖÆ½áËã if not batObj.overTime: GameWorld.ErrLog("ÉÏÒ»ÂÖÕ½¶·Î´½áË㣬ִÐÐÇ¿ÖÆ½áËã! zoneID=%s,preGroupMark=%s,battleNum=%s,mapID=%s,copyMapID=%s" % (zoneID, preGroupMark, battleNum, batObj.mapID, batObj.copyMapID), batObj.roomID) DoBattleOverLogic(zoneID, preGroupMark, battleNum) top8PlayerIDList = pkZoneMgr.GetTop8PlayerIDList() GameWorld.Log("ÅÅλ·ÖÇø8Ç¿Íæ¼ÒIDÁбí: zoneID=%s, %s" % (zoneID, top8PlayerIDList), zoneID) # ´¦Àí8Ç¿¾º²Â·¢½±Àø guessType = 8 moneyType = ShareDefine.TYPE_Price_GongdePoint multiPrice = IpyGameDataPY.GetFuncCfg("CrossChamGuess", 3) # ²ÂÖн±Àø±¶Öµ moneyItemID = ChConfig.MoneyItemIDDict.get(moneyType) GameWorld.Log("¾º²Â·µÀû»õ±ÒÀàÐÍ: moneyType=%s,moneyItemID=%s,multiPrice=%s" % (moneyType, moneyItemID, multiPrice), zoneID) playerGuessDict = pkZoneMgr.guessInfo.get(guessType, {}) for guessPlayerID, guessList in playerGuessDict.items(): guessCorrectCount = 0 # ²ÂÖÐÈËÊý guessCorrectMoney = 0 # ²ÂÖÐ×ÜͶÈë»õ±Ò for guessObj in guessList: if guessObj.guessType != guessType or guessObj.guessPlayerID != guessPlayerID: continue guessObj.isClose = 1 tagPlayerID = guessObj.tagPlayerID moneyTotal = guessObj.moneyTotal if not tagPlayerID or tagPlayerID not in top8PlayerIDList: continue guessCorrectCount += 1 guessCorrectMoney += moneyTotal if guessCorrectMoney <= 0 or multiPrice <= 0 or not moneyItemID: continue moneyPriceTotal = guessCorrectMoney * multiPrice # ×ÜÊÕÒæ paramList = [guessCorrectCount, multiPrice] addItemList = [[moneyItemID, moneyPriceTotal, 0]] PlayerCompensation.SendMailByKey("CrossChampionshipGuess8", [guessPlayerID], addItemList, paramList, crossMail=True) GameWorld.Log("=============================================================") return def DoCrossChampionshipStartEnter(state): ## ¿ªÆô½ø³¡´¦ÀíÂß¼­ if state not in ShareDefine.CrossChampionshipEnterStateInfo: return groupMark = ShareDefine.CrossChampionshipEnterStateInfo[state] mapIndex = 0 mapIDList = IpyGameDataPY.GetFuncEvalCfg("CrossChamFB", 3) GameWorld.Log("¿ç·þÅÅλÕù°ÔÈü¿ªÆô½ø³¡¸±±¾: groupMark=%s,mapIDList=%s" % (groupMark, mapIDList)) champMgr = GetChampionshipMgr() pkZoneIDList = champMgr.GetChampPKZoneIDList() for zoneID in pkZoneIDList: pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: continue if groupMark not in pkZoneMgr.battleInfo: GameWorld.Log("¸Ã¿ç·þÅÅλÕù°ÔÈü·ÖÇøÃ»ÓжÔÕ½×é! zoneID=%s,groupMark=%s" % (zoneID, groupMark), zoneID) continue if mapIndex >= len(mapIDList): GameWorld.ErrLog("¸Ã¿ç·þÅÅλÕù°ÔÈü·ÖÇøÃ»ÓзÖÅä¶ÔÕ½µØÍ¼! zoneID=%s,mapIndex=%s" % (zoneID, mapIndex), zoneID) continue mapID = mapIDList[mapIndex] mapIndex += 1 copyMapID = 0 copyPropertyList = [] battleDict = pkZoneMgr.battleInfo[groupMark] for battleNum in battleDict.keys(): batObj = pkZoneMgr.GetBattle(groupMark, battleNum) if not batObj: continue roomID = GetChampionshipPKRoomID(zoneID, groupMark, battleNum) copyPropertyList.append([copyMapID, roomID]) batObj.mapID = mapID batObj.roomID = roomID batObj.copyMapID = copyMapID # Ìí¼Ó¿ªÆô·ÖÏßÊý¾Ý realMapID = mapID copyMapObj = PlayerFB.CrossCopyMapInfo(zoneID, 0) copyMapObj.realMapID = realMapID copyMapObj.copyMapID = copyMapID key = (realMapID, copyMapID) PyGameData.g_crossDynamicLineCopyMapInfo[key] = copyMapObj GameWorld.Log(" ¶ÔÕ½·¿¼ä! zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s,playerIDB=%s,roomID=%s,mapID=%s,copyMapID=%s" % (zoneID, groupMark, battleNum, batObj.playerIDA, batObj.playerIDB, roomID, mapID, copyMapID)) copyMapID += 1 PlayerFB.SendMapOpenFBEx(mapID, copyPropertyList) return def Sync_CrossChampionshipDataToClientServer(serverGroupID=0): ''' ͬ²½¿ç·þÅÅλÕù°ÔÈüÊý¾Ýµ½×Ó·þÎñÆ÷ @param serverGroupID: Ϊ0ʱͬ²½ËùÓÐ×Ó·þ ''' GameWorld.Log("ͬ²½¸ø×Ó·þÅÅλÕù°ÔÈüÊý¾Ý: syncServerGroupID=%s" % (serverGroupID)) # Í¨ÖªÈ«Çø Send_CrossServerMsg_ChampionshipState(serverGroupID) Send_CrossServerMsg_ChampionshipPlayer(serverGroupID=serverGroupID) Send_CrossServerMsg_ChampionshipGroup(serverGroupID=serverGroupID) Send_CrossServerMsg_ChampionshipGuess(serverGroupID=serverGroupID) Send_CrossServerMsg_ChampionshipOfficial(serverGroupID=serverGroupID) return def Send_CrossServerMsg_ChampionshipState(serverGroupID=0, newAct=False): # ֪ͨ״̬ champMgr = GetChampionshipMgr() pkZoneIDList = champMgr.GetChampPKZoneIDList() ID = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID) State = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState) StateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError) dataMsg = {"ID":ID, "State":State, "StateError":StateError, "PKZoneIDList":pkZoneIDList, "NewAct":newAct} serverGroupIDList = [serverGroupID] if serverGroupID else [] CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipState, dataMsg, serverGroupIDList) return def Send_CrossServerMsg_ChampionshipPlayer(syncPlayerIDList=None, serverGroupID=0, isSync=False, clearPlayer=False): # ֪ͨ²ÎÈüÍæ¼Ò zoneBatPlayerInfo = {} champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampPKZoneIDList(): batPlayerList = [] pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: continue playerIDList = pkZoneMgr.GetBatPlayerIDList() if syncPlayerIDList == None else syncPlayerIDList for playerID in playerIDList: batPlayer = pkZoneMgr.GetBatPlayer(playerID) if not batPlayer: continue batPlayerList.append(batPlayer.GetString()) zoneBatPlayerInfo[zoneID] = batPlayerList dataMsg = {"isSync":isSync, "zoneBatPlayerInfo":zoneBatPlayerInfo, "clearPlayer":clearPlayer} serverGroupIDList = [serverGroupID] if serverGroupID else [] CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipPlayer, dataMsg, serverGroupIDList) return def Send_CrossServerMsg_ChampionshipGroup(groupMark=None, battleObj=None, serverGroupID=0): # ֪ͨ·Ö×é dataMsg = [] if battleObj != None: dataMsg.append(battleObj.GetString()) else: syncGroupMarkList = [groupMark] if groupMark != None else ShareDefine.CrossChampionshipEnterStateInfo.values() champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampPKZoneIDList(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: continue for gMark in syncGroupMarkList: battleDict = pkZoneMgr.battleInfo.get(gMark, {}) if not battleDict: continue for num in battleDict.keys(): battleObj = pkZoneMgr.GetBattle(gMark, num) dataMsg.append(battleObj.GetString()) serverGroupIDList = [serverGroupID] if serverGroupID else [] CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipGroup, dataMsg, serverGroupIDList) return def Send_CrossServerMsg_ChampionshipGuess(syncZoneID=None, playerID=0, guessObj=None, serverGroupID=0, exData=None, syncPub=True): ## ֪ͨ¾º²Â champMgr = GetChampionshipMgr() # ÒòΪ¾º²ÂÊÇÃæÏòÈ«·þµÄÍæ¼Ò£¬ËùÒÔÖ»ÄÜÕë¶Ôÿ¸öÍæ¼Òµ¥¶Àͬ²½×Ô¼º²ÎÓë¹ýµÄ¾º²Â guessList = [] if syncZoneID and playerID: if guessObj != None and guessObj.guessPlayerID == playerID: guessList.append(guessObj.GetString()) else: pkZoneMgr = champMgr.GetChampPKZoneMgr(syncZoneID) if pkZoneMgr: for playerGuessDict in pkZoneMgr.guessInfo.values(): if playerID not in playerGuessDict: continue playerGuessList = playerGuessDict[playerID] for guess in playerGuessList: guessList.append(guess.GetString()) dataMsg = {"exData":exData if exData else {}, "guessList":guessList} if syncPub: zoneSupportCountInfo = {} syncZoneIDList = [syncZoneID] if syncZoneID else champMgr.GetChampPKZoneIDList() for zoneID in syncZoneIDList: pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: continue zoneSupportCountInfo[zoneID] = pkZoneMgr.supportCountInfo dataMsg["pubInfo"] = {"zoneSupportCountInfo":zoneSupportCountInfo} serverGroupIDList = [serverGroupID] if serverGroupID else [] if syncPub: serverGroupIDList = [] # ͬ²½¹«¹²ÐÅϢʱ£¬Ä¬ÈÏÈ«·þ¹ã²¥ CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipGuess, dataMsg, serverGroupIDList) return def CrossServerMsg_ChampionshipState(msgData): ## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄÐÅÏ¢ - ¿ç·þÅÅλÕù°ÔÈü״̬ ID = msgData["ID"] State = msgData["State"] StateError = msgData["StateError"] PKZoneIDList = msgData["PKZoneIDList"] newAct = msgData["NewAct"] dbID = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID, ID) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState, State) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError, StateError) # ×Ó·þÊý¾ÝÖØÖà if dbID != ID or newAct: champMgr = GetChampionshipMgr() prePKZoneIDList = champMgr.GetChampPKZoneIDList() champMgr.ClearPKZone() GameWorld.Log("×Ó·þÖØÖÿç·þÅÅλÕù°ÔÈü¶ÔÕ½Êý¾Ý! dbID=%s,ID=%s,PKZoneIDList=%s,prePKZoneIDList=%s" % (dbID, ID, PKZoneIDList, prePKZoneIDList)) for zoneID in PKZoneIDList: champMgr.GetChampPKZoneMgr(zoneID) return def CrossServerMsg_ChampionshipPlayer(msgData): ## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄÐÅÏ¢ - ²ÎÈüÍæ¼ÒÐÅÏ¢ isSync = msgData["isSync"] clearPlayer = msgData["clearPlayer"] zoneBatPlayerInfo = msgData["zoneBatPlayerInfo"] champMgr = GetChampionshipMgr() for zoneID, batPlayerList in zoneBatPlayerInfo.items(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) if not batPlayerList: if clearPlayer: pkZoneMgr.playerDict = {} else: for attrDict in batPlayerList: zoneID = attrDict["zoneID"] playerID = attrDict["playerID"] batPlayer = pkZoneMgr.GetBatPlayer(playerID) if not batPlayer: batPlayer = ChampionshipBatPlayer() pkZoneMgr.playerDict[playerID] = batPlayer batPlayer.SetAttr(attrDict) if isSync: Sync_ChampionshipPKZoneGroupInfo(zoneID) return def CrossServerMsg_ChampionshipGroup(msgData): ## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄÐÅÏ¢ - ·Ö×éÐÅÏ¢ syncGroupInfo = {} champMgr = GetChampionshipMgr() for attrDict in msgData: zoneID = attrDict["zoneID"] groupMark = attrDict["groupMark"] battleNum = attrDict["battleNum"] pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) battle = pkZoneMgr.GetBattle(groupMark, battleNum) if not battle: battle = ChampionshipBattle() pkZoneMgr.AddBattle(groupMark, battleNum, battle) battle.SetAttr(attrDict) if zoneID not in syncGroupInfo: syncGroupInfo[zoneID] = {} groupMarkDict = syncGroupInfo[zoneID] if groupMark not in groupMarkDict: groupMarkDict[groupMark] = [] battleNumList = groupMarkDict[groupMark] if battleNum not in battleNumList: battleNumList.append(battleNum) for zoneID, groupMarkDict in syncGroupInfo.items(): Sync_ChampionshipPKZoneGroupInfo(zoneID, groupMarkDict) return def CrossServerMsg_ChampionshipGuess(msgData, tick): ## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄÐÅÏ¢ - ¾º²ÂÐÅÏ¢ exData = msgData["exData"] guessList = msgData["guessList"] pubInfo = msgData.get("pubInfo", None) if not exData or not isinstance(exData, dict): exData = {} exDataType = exData.get("exDataType", "") playerID = exData.get("playerID", 0) champMgr = GetChampionshipMgr() syncKeyInfo = {} for attrDict in guessList: zoneID = attrDict["zoneID"] guessType = attrDict["guessType"] guessPlayerID = attrDict["guessPlayerID"] tagPlayerID = attrDict["tagPlayerID"] if guessType not in syncKeyInfo: syncKeyInfo[guessType] = [] syncTagPlayerIDList = syncKeyInfo[guessType] syncTagPlayerIDList.append(tagPlayerID) # ¾º²ÂÁбí½öÕë¶ÔÍæ¼Ò¸öÈË£¬ËùÒÔ²»ÊÇÇëÇó·½Íæ¼Ò»ò±¾·þÍæ¼ÒÔò²»´¦Àí¸öÈËÐÅÏ¢£¬½ö´¦Àí¹«¹²ÐÅÏ¢ if playerID != guessPlayerID: continue if not PlayerControl.GetDBPlayerAccIDByID(guessPlayerID): # ·Ç±¾·þÍæ¼Ò continue pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) guessObj = None playerGuessList = pkZoneMgr.GetPlayerGuessList(guessPlayerID, guessType) for guess in playerGuessList: if guess.tagPlayerID == tagPlayerID: guessObj = guess break if not guessObj: guessObj = ChampionshipGuess() playerGuessList.append(guessObj) guessObj.SetAttr(attrDict) pubZoneIDList = [] if pubInfo != None: zoneSupportCountInfo = pubInfo["zoneSupportCountInfo"] for zoneID, supportCountInfo in zoneSupportCountInfo.items(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) pkZoneMgr.supportCountInfo = supportCountInfo pubZoneIDList.append(zoneID) if exDataType == "ChampionshipGuessQuery": # ²éѯµÄÖ»´¦Àí±¾·þÍæ¼Ò if not playerID: return if not PlayerControl.GetDBPlayerAccIDByID(playerID): # ·Ç±¾·þÍæ¼Ò return zoneID = exData.get("zoneID", 0) pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) pkZoneMgr.syncGuessPlayerIDInfo[playerID] = tick curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if curPlayer == None: return Sync_ChampionshipGuessPriInfo(curPlayer, syncKeyInfo) Sync_ChampionshipGuessPubInfo(zoneID, curPlayer, syncKeyInfo) return if exDataType == "ChampionshipGuess": # ¾º²ÂµÄÈç¹ûÓй«¹²ÐÅÏ¢ÐèÒª¹ã²¥È«·þÍæ¼Ò£¬¸öÈËÐÅϢֻͬ²½¸Ã¾º²ÂÍæ¼Ò zoneID = exData.get("zoneID", 0) if pubInfo != None: Sync_ChampionshipGuessPubInfo(zoneID, None, syncKeyInfo) if not playerID: return if not PlayerControl.GetDBPlayerAccIDByID(playerID): # ·Ç±¾·þÍæ¼Ò return msgInfo = [exDataType, exData] curPlayer = CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "Championship", msgInfo, True) if curPlayer: Sync_ChampionshipGuessPriInfo(curPlayer, syncKeyInfo) return return def OnRequestChampionshipVSRoom(playerID, serverGroupID): ## ÇëÇó½øÈëÅÅλ¶ÔÕ½·¿¼ä stateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError) if stateError: GameWorld.ErrLog("¿ç·þÅÅλ״̬ÒѾ­Òì³£ÎÞ·¨½øÈë! stateError=%s" % stateError, playerID) return state = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState) if state not in ShareDefine.CrossChampionshipEnterStateInfo: GameWorld.ErrLog("µ±Ç°×´Ì¬·Ç¿ç·þÅÅλս¶·×´Ì¬ÎÞ·¨½øÈë: state=%s" % state, playerID) return groupMark = ShareDefine.CrossChampionshipEnterStateInfo[state] mapPosList = IpyGameDataPY.GetFuncEvalCfg("CrossChamFB", 2) if not mapPosList: GameWorld.ErrLog("ûÓÐÅäÖÿç·þÅÅλ¶ÔÕ½µØÍ¼½øÈë×ø±ê£¡ CrossChamFB ÊýÖµ2") return roomID = 0 vsRoomDict = {} champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampPKZoneIDList(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: continue if groupMark not in pkZoneMgr.battleInfo: continue battleDict = pkZoneMgr.battleInfo[groupMark] for battleNum in battleDict.keys(): batObj = pkZoneMgr.GetBattle(groupMark, battleNum) if not batObj: continue if playerID == batObj.playerIDA:# or batObj.playerIDA == 496607: factionIndex = 0 elif playerID == batObj.playerIDB:# or batObj.playerIDB == 489566: factionIndex = 1 else: continue if not batObj.mapID: GameWorld.ErrLog("¸Ã¿ç·þÅÅλ¶ÔսûÓзÖÅä¶ÔÕ½µØÍ¼£¬ÎÞ·¨½øÈë! groupMark=%s,battleNum=%s" % (groupMark, battleNum), playerID) return roomID = batObj.roomID realMapID = batObj.mapID copyMapID = batObj.copyMapID key = (realMapID, copyMapID) if key not in PyGameData.g_crossDynamicLineCopyMapInfo: GameWorld.ErrLog("¸Ã¿ç·þÅÅλ¶ÔսûÓзÖÅä¶ÔÕ½µØÍ¼Ïß·£¬ÎÞ·¨½øÈë! groupMark=%s,battleNum=%s,realMapID=%s,copyMapID=%s" % (groupMark, battleNum, realMapID, copyMapID), playerID) return copyMapObj = PyGameData.g_crossDynamicLineCopyMapInfo[key] if copyMapObj.openState != IPY_PlayerDefine.fbosOpen: GameWorld.Log("¸Ã¿ç·þÅÅλ¶ÔÕ½·ÖÅäµÄµØÍ¼Ïß··Ç¿ªÆô״̬£¬ÎÞ·¨½øÈë! groupMark=%s,battleNum=%s,realMapID=%s,copyMapID=%s,openState=%s" % (groupMark, battleNum, realMapID, copyMapID, copyMapObj.openState), playerID) return posX, posY = mapPosList[factionIndex] if len(mapPosList) > factionIndex else mapPosList[0] registerMap = ChConfig.Def_FBMapID_CrossChampionship dataMapID = realMapID vsRoomDict = {roomID:{playerID:{"regMapInfo":[registerMap, realMapID, dataMapID, copyMapID, posX, posY]}}} GameWorld.Log("Íæ¼ÒÇëÇó¿ç·þÅÅλ¶ÔÕ½×é: zoneID=%s,groupMark=%s,battleNum=%s,roomID=%s" % (zoneID, groupMark, battleNum, roomID), playerID) break if not roomID or not vsRoomDict: GameWorld.ErrLog("ÕÒ²»µ½Íæ¼Ò¿ç·þÅÅλ¶ÔÕ½×é: state=%s,groupMark=%s" % (state, groupMark), playerID) return PlayerFB.Send_CrossServerMsg_EnterVSRoomRet(vsRoomDict, [serverGroupID]) return def GetChampionshipPKRoomID(zoneID, groupMark, battleNum): return int("%d%03d%02d" % (zoneID, groupMark, battleNum)) def MapServer_CrossChampionshipPKOver(infoList, tick): ## ÊÕµ½MapServer¸±±¾¿ç·þÅÅλPK½á¹ûͬ²½ roomID, winnerID, loserID, roundWinnerIDList, overType = infoList zoneID = roomID / 100000 groupMark = roomID % 100000 / 100 battleNum = roomID % 100 GameWorld.Log("=== ÊÕµ½MapServer_¿ç·þÅÅλPKÕ½¶·½á¹û: zoneID=%s,groupMark=%s,battleNum=%s,roomID=%s,winnerID=%s,loserID=%s,roundWinnerIDList=%s,overType=%s" % (zoneID, groupMark, battleNum, roomID, winnerID, loserID, roundWinnerIDList, overType), roomID) DoBattleOverLogic(zoneID, groupMark, battleNum, winnerID, loserID, roundWinnerIDList, overType) return def DoBattleOverLogic(zoneID, groupMark, battleNum, winnerID=0, loserID=0, roundWinnerIDList=None, overType=0): ## Ö´ÐжÔÕ½½áËãÂß¼­ if not zoneID: return groupMarkList = ShareDefine.CrossChampionshipEnterStateInfo.values() if groupMark not in groupMarkList: GameWorld.ErrLog("¿ç·þÅÅλ½áËã·Ö×éÒì³£! groupMark=%s" % groupMark) return champMgr = GetChampionshipMgr() pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: return battleObj = pkZoneMgr.GetBattle(groupMark, battleNum) if not battleObj: return if roundWinnerIDList == None: roundWinnerIDList = [] roomID = battleObj.roomID if battleObj.overTime: GameWorld.ErrLog("¿ç·þÅÅλPK¶ÔÕ½ÒѾ­½áËã¹ýÁË£¬²»Öظ´½áËã! zoneID=%s,groupMark=%s,battleNum=%s,winPlayerID=%s,overTime=%s" % (zoneID, groupMark, battleNum, battleObj.winPlayerID, GameWorld.ChangeTimeNumToStr(battleObj.overTime)), roomID) return playerIDA = battleObj.playerIDA playerIDB = battleObj.playerIDB roomPlayerIDList = [playerIDA, playerIDB] GameWorld.Log("½áËã¿ç·þÅÅλPKÕ½¶·½á¹û: zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s,playerIDB=%s,roomPlayerIDList=%s" % (zoneID, groupMark, battleNum, playerIDA, playerIDB, roomPlayerIDList), roomID) if playerIDA and playerIDB: if not winnerID and not loserID: playerA = pkZoneMgr.GetBatPlayer(playerIDA) playerB = pkZoneMgr.GetBatPlayer(playerIDB) fightPowerA = playerA.fightPower if playerA else 0 fightPowerB = playerB.fightPower if playerB else 0 if fightPowerA > fightPowerB: winnerID, loserID = playerIDA, playerIDB GameWorld.Log(" ¿ç·þÅÅλÈü¶ÔÕ½µØÍ¼Ã»ÓÐÍæ¼Ò²ÎÓë»òûÓÐʤ¸ºÍæ¼Ò£¬Õ½Á¦¸ß»ñʤ! fightPowerA=%s(%s) > fightPowerB=%s(%s),winnerID=%s,loserID=%s" % (fightPowerA, playerIDA, fightPowerB, playerIDB, winnerID, loserID), roomID) elif fightPowerA < fightPowerB: winnerID, loserID = playerIDB, playerIDA GameWorld.Log(" ¿ç·þÅÅλÈü¶ÔÕ½µØÍ¼Ã»ÓÐÍæ¼Ò²ÎÓë»òûÓÐʤ¸ºÍæ¼Ò£¬Õ½Á¦¸ß»ñʤ! fightPowerA=%s(%s) < fightPowerB=%s(%s),winnerID=%s,loserID=%s" % (fightPowerA, playerIDA, fightPowerB, playerIDB, winnerID, loserID), roomID) else: random.shuffle(roomPlayerIDList) winnerID, loserID = roomPlayerIDList GameWorld.Log(" ¿ç·þÅÅλÈü¶ÔÕ½µØÍ¼Ã»ÓÐÍæ¼Ò²ÎÓë»òûÓÐʤ¸ºÍæ¼Ò£¬Õ½Á¦ÏàÍ¬Ëæ»úÍæ¼Ò»ñʤ! fightPowerA=%s(%s) = fightPowerB=%s(%s),winnerID=%s,loserID=%s" % (fightPowerA, playerIDA, fightPowerB, playerIDB, winnerID, loserID), roomID) elif not loserID: for roomPlayerID in roomPlayerIDList: if roomPlayerID != winnerID: loserID = roomPlayerID GameWorld.Log(" ¿ç·þÅÅλÈü¶ÔÕ½µØÍ¼Ã»ÓÐʧ°ÜÍæ¼Ò£¬Ä¬È϶Է½ÎªÊ§°ÜÍæ¼Ò! loserID=%s" % loserID, roomID) break if not winnerID or winnerID not in roomPlayerIDList or loserID not in roomPlayerIDList: GameWorld.ErrLog("¿ç·þÅÅλÈüPK·¿¼äʤ¸ºÍæ¼ÒÒì³££¬²»½áË㣡 roomID=%s,winnerID=%s,loserID=%s,roomPlayerIDList=%s" % (roomID, winnerID, loserID, roomPlayerIDList), roomID) return elif playerIDA: winnerID = playerIDA loserID = playerIDB GameWorld.Log(" ¿ç·þÅÅλÈü¶ÔÕ½Íæ¼ÒÂÖ¿Õ£¬Ä¬ÈÏ»ñʤ! winner is playerIDA=%s,loserID=%s" % (playerIDA, loserID), roomID) elif playerIDB: winnerID = playerIDB loserID = playerIDA GameWorld.Log(" ¿ç·þÅÅλÈü¶ÔÕ½Íæ¼ÒÂÖ¿Õ£¬Ä¬ÈÏ»ñʤ! winner is playerIDB=%s,loserID=%s" % (playerIDB, loserID), roomID) else: GameWorld.Log(" ¿ç·þÅÅλÈüPK·¿¼äÎÞÍæ¼Ò! roomID=%s,winnerID=%s,loserID=%s,roomPlayerIDList=%s" % (roomID, winnerID, loserID, roomPlayerIDList), roomID) # ¸üлñÊ¤Íæ¼ÒID¡¢½áÊøÊ±¼ä battleObj.winPlayerID = winnerID battleObj.overTime = int(time.time()) winner = pkZoneMgr.GetBatPlayer(winnerID) loser = pkZoneMgr.GetBatPlayer(loserID) winnerName = winner.playerName if winner else str(winnerID) loserName = loser.playerName if loser else str(loserID) # ¾öÈü¿É»ñÈ¡×îÖÕÃû´Î playerRankInfo = {} if groupMark == 2: playerRankInfo = GetZoneIDRankInfo(zoneID, [winnerID, loserID]) if groupMark == 64: wfAwardItemList = IpyGameDataPY.GetFuncEvalCfg("CrossChamWFAward", 1) elif groupMark == 32: wfAwardItemList = IpyGameDataPY.GetFuncEvalCfg("CrossChamWFAward", 2) elif groupMark == 16: wfAwardItemList = IpyGameDataPY.GetFuncEvalCfg("CrossChamWFAward", 3) else: wfAwardItemList = IpyGameDataPY.GetFuncEvalCfg("CrossChamWFAward", 4) wAwardItemList, fAwardItemList = [], [] if wfAwardItemList and len(wfAwardItemList) == 2: wAwardItemList, fAwardItemList = wfAwardItemList timeStr = GameWorld.GetCurrentDataTimeStr() # ½áËã for playerID in [winnerID, loserID]: if not playerID: continue if playerID == winnerID: addItemList = wAwardItemList mailTypeKey = "CrossChampionshipPKWin%s" % groupMark tagPlayerID, tagPlayerName = loserID, loserName else: addItemList = fAwardItemList mailTypeKey = "CrossChampionshipPKLose%s" % groupMark tagPlayerID, tagPlayerName = winnerID, winnerName rank = playerRankInfo.get(playerID, 0) GameWorld.Log(" ½áËã¿ç·þÅÅλÈüÍæ¼Ò½±Àø: zoneID=%s,roomID=%s,groupMark=%s,battleNum=%s,rank=%s,tagPlayerID=%s" % (zoneID, roomID, groupMark, battleNum, rank, tagPlayerID), playerID) if rank: paramList = [rank] else: paramList = [] playerIDList = [playerID] PlayerCompensation.SendMailByKey(mailTypeKey, playerIDList, addItemList, paramList, crossMail=True) player = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if player: overPack = ChPyNetSendPack.tagGCCrossChampionshipPKOver() overPack.GroupMark = groupMark overPack.TimeStr = timeStr overPack.OverType = overType overPack.WinnerID = winnerID overPack.LoserID = loserID overPack.RoundWinnerID = roundWinnerIDList overPack.RoundCount = len(overPack.RoundWinnerID) overPack.TagName = tagPlayerName overPack.TagNameLen = len(overPack.TagName) overPack.Rank = rank NetPackCommon.SendFakePack(player, overPack) # ͬ²½×Ó·þ Send_CrossServerMsg_ChampionshipGroup(battleObj=battleObj) # ¼Ç¼Á÷Ïò winnerInfo = winner.GetString() if winner else {} loserInfo = loser.GetString() if loser else {} dataDict = {"roundWinnerIDList":roundWinnerIDList, "overType":overType, "winner":winnerInfo, "loser":loserInfo, "battle":battleObj.GetString(), "playerRankInfo":playerRankInfo} DR_CrossChampionshipPK("PKRoomOver", dataDict) return def DoCrossChampionshipFinalOver(): ## Ö´ÐнáËã×îÖÕ½á¹û£¬ËùÓзÖÇøÍ¬Ò»Ê±¼äµã´¦Àí GameWorld.Log("===================== Ö´Ðпç·þÅÅλ×îÖÕ½áËã ===========================") finalGroupMark = 2 # ¾öÈü·Ö×é champMgr = GetChampionshipMgr() champMgr.ClearOfficialZone() # ×îÖÕ½áËãÖØÖÃÏɹÙÐÅÏ¢£¬Ìæ»»×îÐÂÏɹ٠# Ĥ°ÝÖØÖà worshipType = ShareDefine.Def_WorshipType_CrossChampionship GameWorship.DelWorshipPlayer(worshipType) pkZoneIDList = champMgr.GetChampPKZoneIDList() GameWorld.Log("pkZoneIDList=%s" % pkZoneIDList) worshipList = [] for zoneID in pkZoneIDList: GameWorld.Log("=== ½áËãÅÅλ·ÖÇø: zoneID=%s ===" % zoneID, zoneID) finalPlayerIDList = [] pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: continue battleNumList = pkZoneMgr.battleInfo.get(finalGroupMark, {}).keys() for battleNum in battleNumList: batObj = pkZoneMgr.GetBattle(finalGroupMark, battleNum) if not batObj: continue if not batObj.overTime: GameWorld.ErrLog("×îÖÕÕ½¶·Î´½áË㣬ִÐÐÇ¿ÖÆ½áËã! zoneID=%s,finalGroupMark=%s,battleNum=%s,mapID=%s,copyMapID=%s" % (zoneID, finalGroupMark, battleNum, batObj.mapID, batObj.copyMapID), batObj.roomID) DoBattleOverLogic(zoneID, finalGroupMark, battleNum) if batObj.playerIDA and batObj.playerIDA not in finalPlayerIDList: finalPlayerIDList.append(batObj.playerIDA) if batObj.playerIDB and batObj.playerIDB not in finalPlayerIDList: finalPlayerIDList.append(batObj.playerIDB) offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) playerRankInfo = GetZoneIDRankInfo(zoneID, finalPlayerIDList) for playerID, rank in playerRankInfo.items(): batPlayer = pkZoneMgr.GetBatPlayer(playerID) accID = "" if not batPlayer else batPlayer.accID fightPower = 0 if not batPlayer else batPlayer.fightPower rankIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipRank", rank) officialID = rankIpyData.GetMainOfficialID() if rankIpyData else 0 rankAwardItemList = rankIpyData.GetRankAwardItemList() if rankIpyData else [] GameWorld.Log(" ×îÖÕÅÅÃû: zoneID=%s,rank=%s,playerID=%s,officialID=%s,rankAwardItemList=%s,accID=%s,fightPower=%s" % (zoneID, rank, playerID, officialID, rankAwardItemList, accID, fightPower), zoneID) if officialID: offObj = ChampionshipOfficial() offObj.zoneID = zoneID offObj.officialID = officialID offObj.rank = rank offObj.playerID = playerID offZoneMgr.officialInfo[officialID] = offObj worshipValue = rank if GameWorship.GetWorshipIpyData(worshipType, worshipValue): worshipData = GameWorship.AddWorshipPlayer(playerID, worshipType, worshipValue, zoneID=zoneID, isNotify=False) worshipList.append(worshipData) # Ãû´Î½±Àø paramList = [rank] PlayerCompensation.SendMailByKey("CrossChampionshipPKRank", [playerID], rankAwardItemList, paramList, crossMail=True) # ´¦Àí4Ç¿¾º²Â·¢½±Àø guessType = 4 moneyType = ShareDefine.TYPE_Price_GongdePoint multiPriceDict = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 4, {}) # ²ÂÖн±Àø±¶Öµ×Öµä moneyItemID = ChConfig.MoneyItemIDDict.get(moneyType) GameWorld.Log("¾º²Â·µÀû»õ±ÒÀàÐÍ: moneyType=%s,moneyItemID=%s,multiPriceDict=%s" % (moneyType, moneyItemID, multiPriceDict), zoneID) playerGuessDict = pkZoneMgr.guessInfo.get(guessType, {}) for guessPlayerID, guessList in playerGuessDict.items(): guessCorrectCount = 0 # ²ÂÖÐÈËÊý guessCorrectMoney = 0 # ²ÂÖÐ×ÜͶÈë»õ±Ò for guessObj in guessList: if guessObj.guessType != guessType or guessObj.guessPlayerID != guessPlayerID: continue guessObj.isClose = 1 tagPlayerID = guessObj.tagPlayerID guessRank = guessObj.guessRank moneyTotal = guessObj.moneyTotal if not tagPlayerID or tagPlayerID not in playerRankInfo: continue playerRank = playerRankInfo[tagPlayerID] if playerRank != guessRank: continue guessCorrectCount += 1 guessCorrectMoney += moneyTotal multiPrice = multiPriceDict.get(str(guessCorrectCount), 0) if guessCorrectMoney <= 0 or multiPrice <= 0 or not moneyItemID: continue moneyPriceTotal = guessCorrectMoney * multiPrice # ×ÜÊÕÒæ paramList = [guessCorrectCount, multiPrice] addItemList = [[moneyItemID, moneyPriceTotal, 0]] PlayerCompensation.SendMailByKey("CrossChampionshipGuess4", [guessPlayerID], addItemList, paramList, crossMail=True) exData = {"exDataType":"OfficialReset"} Send_CrossServerMsg_ChampionshipOfficial(exData=exData) serverGroupIDList = [] # È«·þͳһÂß¼­ PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "ChampionshipOver") # ֪ͨÐÂÌí¼ÓµÄĤ°Ý GameWorship.SyncAddCrossWorship(worshipList) GameWorld.Log("===================================================================") return def GetZoneIDRankInfo(zoneID, playerIDList): ## »ñÈ¡·ÖÇøÍæ¼ÒÅÅÃû champMgr = GetChampionshipMgr() pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: return {} # ¾öÈü finalGroupMark = 2 finalWinPlayerIDList, finalLosePlayerIDList = [], [] battleNumList = pkZoneMgr.battleInfo.get(finalGroupMark, {}).keys() for battleNum in battleNumList: batObj = pkZoneMgr.GetBattle(finalGroupMark, battleNum) if not batObj: continue if not batObj.overTime or not batObj.winPlayerID: continue winPlayerID = batObj.playerIDA if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDB losePlayerID = batObj.playerIDB if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDA finalWinPlayerIDList.append(winPlayerID) finalLosePlayerIDList.append(losePlayerID) # °ë¾öÈü semiGroupMark = 4 semiWinPlayerIDList, semiLosePlayerIDList = [], [] battleNumList = pkZoneMgr.battleInfo.get(semiGroupMark, {}).keys() for battleNum in battleNumList: batObj = pkZoneMgr.GetBattle(semiGroupMark, battleNum) if not batObj: continue if not batObj.overTime or not batObj.winPlayerID: continue winPlayerID = batObj.playerIDA if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDB losePlayerID = batObj.playerIDB if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDA semiWinPlayerIDList.append(winPlayerID) semiLosePlayerIDList.append(losePlayerID) # 1/4¾öÈü wlGroupMark = 8 winGroupPlayerIDList, loseGroupPlayerIDList = [], [] # ʤÕß×é¡¢°ÜÕß×é battleNumList = pkZoneMgr.battleInfo.get(wlGroupMark, {}).keys() for battleNum in battleNumList: batObj = pkZoneMgr.GetBattle(wlGroupMark, battleNum) if not batObj: continue if not batObj.overTime or not batObj.winPlayerID: continue winPlayerID = batObj.playerIDA if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDB losePlayerID = batObj.playerIDB if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDA winGroupPlayerIDList.append(winPlayerID) loseGroupPlayerIDList.append(losePlayerID) GameWorld.Log(" 8Ç¿Èüʤ¸º: zoneID=%s,ʤÕßID=%s,°ÜÕßID=%s" % (zoneID, winGroupPlayerIDList, loseGroupPlayerIDList), zoneID) GameWorld.Log(" °ë¾öÈüʤ¸º: zoneID=%s,ʤÕßID=%s,°ÜÕßID=%s" % (zoneID, semiWinPlayerIDList, semiLosePlayerIDList), zoneID) GameWorld.Log(" ×ܾöÈüʤ¸º: zoneID=%s,ʤÕßID=%s,°ÜÕßID=%s" % (zoneID, finalWinPlayerIDList, finalLosePlayerIDList), zoneID) playerRankInfo = {} for playerID in playerIDList: if not playerID: continue if playerID in winGroupPlayerIDList: if playerID in semiWinPlayerIDList: if playerID in finalWinPlayerIDList: playerRankInfo[playerID] = 1 elif playerID in finalLosePlayerIDList: playerRankInfo[playerID] = 2 elif playerID in semiLosePlayerIDList: if playerID in finalWinPlayerIDList: playerRankInfo[playerID] = 3 elif playerID in finalLosePlayerIDList: playerRankInfo[playerID] = 4 elif playerID in loseGroupPlayerIDList: if playerID in semiWinPlayerIDList: if playerID in finalWinPlayerIDList: playerRankInfo[playerID] = 5 elif playerID in finalLosePlayerIDList: playerRankInfo[playerID] = 6 elif playerID in semiLosePlayerIDList: if playerID in finalWinPlayerIDList: playerRankInfo[playerID] = 7 elif playerID in finalLosePlayerIDList: playerRankInfo[playerID] = 8 GameWorld.Log(" zoneID=%s,playerRankInfo=%s" % (zoneID, playerRankInfo), zoneID) return playerRankInfo def Send_CrossServerMsg_ChampionshipOfficial(syncZonID=None, syncOfficialIDList=None, serverGroupID=0, exData=None): officialList = [] champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampOfficialZoneIDList(): if syncZonID != None and zoneID != syncZonID: continue offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) officialIDList = offZoneMgr.officialInfo.keys() if syncOfficialIDList == None else syncOfficialIDList for officialID in officialIDList: offObj = offZoneMgr.GetOfficialObj(officialID) if not offObj: continue officialList.append(offObj.GetString()) dataMsg = {"exData":exData if exData else {}, "officialList":officialList} serverGroupIDList = [serverGroupID] if serverGroupID else [] CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipOfficial, dataMsg, serverGroupIDList) return def CrossServerMsg_ChampionshipOfficial(msgData): ## ÊÕµ½¿ç·þͬ²½µÄ¹Ù¾ôÍæ¼ÒÐÅÏ¢ exData = msgData["exData"] officialList = msgData["officialList"] if not exData or not isinstance(exData, dict): exData = {} exDataType = exData.get("exDataType", "") champMgr = GetChampionshipMgr() ## ¹ÙÖ°ÖØÖà if exDataType == "OfficialReset": champMgr.ClearOfficialZone() syncZoneOfficialInfo = {} for attrDict in officialList: zoneID = attrDict["zoneID"] officialID = attrDict["officialID"] offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) offObj = offZoneMgr.GetOfficialObj(officialID) if not offObj: offObj = ChampionshipOfficial() offZoneMgr.officialInfo[officialID] = offObj offObj.SetAttr(attrDict) if zoneID not in syncZoneOfficialInfo: syncZoneOfficialInfo[zoneID] = [] officialIDList = syncZoneOfficialInfo[zoneID] if officialID not in officialIDList: officialIDList.append(officialID) for zoneID, officialIDList in syncZoneOfficialInfo.items(): Sync_ChampionshipOfficialInfo(zoneID, officialIDList) if not exData: return ## ¹ÙÖ°ÉêÇë»ØÓ¦ if exDataType == "OfficialApplyReply": mainPlayerName = exData["mainPlayerName"] mainOfficialID = exData["mainOfficialID"] officialID = exData["officialID"] replyDict = exData["replyDict"] for playerID, isOK in replyDict.items(): curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if curPlayer == None or not curPlayer.GetInitOK(): continue clientPack = ChPyNetSendPack.tagGCChampionshipOfficialApplyReplyRet() clientPack.PlayerName = mainPlayerName clientPack.NameLen = len(clientPack.PlayerName) clientPack.MainOfficialID = mainOfficialID clientPack.OfficialID = officialID clientPack.IsOK = 1 if isOK else 0 NetPackCommon.SendFakePack(curPlayer, clientPack) ## ¹ÙÖ°ÌôÕ½½á¹û elif exDataType == "OfficialChallenge": playerID = exData["playerID"] tagPlayerName = exData["tagPlayerName"] mainOfficialID = exData["mainOfficialID"] officialID = exData["officialID"] Ret = exData["Ret"] curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if curPlayer: clientPack = ChPyNetSendPack.tagGCChampionshipOfficialChallengeRet() clientPack.PlayerName = tagPlayerName clientPack.NameLen = len(clientPack.PlayerName) clientPack.MainOfficialID = mainOfficialID clientPack.OfficialID = officialID clientPack.Ret = Ret NetPackCommon.SendFakePack(curPlayer, clientPack) ## Ĥ°Ý elif exDataType == "OfficialWorship": playerID = exData["playerID"] if not playerID: return if not PlayerControl.GetDBPlayerAccIDByID(playerID): # ·Ç±¾·þÍæ¼Ò return msgInfo = [exDataType, exData] CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "Championship", msgInfo, True) return def ClientServerMsg_ChampionshipGuess(serverGroupID, msgData): ## ÊÕµ½×Ó·þÐÅÏ¢ - ¿ç·þÅÅλ¾º²Â if "exDataType" not in msgData: return exDataType = msgData["exDataType"] # ²éÑ¯Íæ¼ÒËùÓвÎÓëµÄ¾º²Â if exDataType == "ChampionshipGuessQuery": zoneID = msgData["zoneID"] playerID = msgData["playerID"] Send_CrossServerMsg_ChampionshipGuess(zoneID, playerID, serverGroupID=serverGroupID, exData=msgData) return if exDataType != "ChampionshipGuess": return zoneID = msgData["zoneID"] playerID = msgData["playerID"] guessType = msgData["guessType"] tagPlayerID = msgData["tagPlayerID"] guessRank = msgData["guessRank"] guessMoney = msgData["guessMoney"] moneyType = msgData["moneyType"] if not tagPlayerID or not guessMoney: return stateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError) if stateError: GameWorld.ErrLog("¿ç·þÅÅλ״̬ÒѾ­Òì³£ÎÞ·¨¾º²Â! stateError=%s" % stateError, playerID) return guessTypeStateDict = {8:ShareDefine.CrossChampionshipState_Guess8, 4:ShareDefine.CrossChampionshipState_Guess4, } state = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState) if guessType not in guessTypeStateDict or state != guessTypeStateDict[guessType]: GameWorld.ErrLog("¾º²ÂÀàÐÍ´íÎó»òµ±Ç°×´Ì¬ÎÞ·¨½øÐиÃÀàÐ;º²Â! guessType=%s,state=%s" % (guessType, state), playerID) return curMoneyType, moneyValue = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 1) guessCountMax = IpyGameDataPY.GetFuncCfg("CrossChamGuess", 2) guessMoneyMax = moneyValue * guessCountMax if moneyType != curMoneyType: GameWorld.ErrLog("¾º²Â»õ±ÒÀàÐͲ»Ò»ÖÂ! moneyType=%s != curMoneyType=%s" % (moneyType, curMoneyType), playerID) return champMgr = GetChampionshipMgr() pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: return tagBatPlayer = pkZoneMgr.GetBatPlayer(tagPlayerID) if not tagBatPlayer: GameWorld.ErrLog("¸Ã·ÖÇø²»´æÔڸòÎÈüÍæ¼Ò£¬ÎÞ·¨ÅÅλ¾º²Â! zoneID=%s,tagPlayerID=%s" % (zoneID, tagPlayerID), playerID) return guessTagPlayerCountMax = guessType # 4Ç¿¾º²Â if guessType == 4: if guessRank <= 0 or guessRank > guessTagPlayerCountMax: GameWorld.ErrLog("¾º²ÂÃû´Î´íÎó! zoneID=%s,guessType=%s,guessRank=%s" % (zoneID, guessType, guessRank), playerID) return top8PlayerIDList = pkZoneMgr.GetTop8PlayerIDList() if tagPlayerID not in top8PlayerIDList: GameWorld.ErrLog("Ä¿Ç°Íæ¼Ò·Ç¸Ã·ÖÇø8Ç¿Íæ¼Ò£¬ÎÞ·¨¾º²Â! zoneID=%s,tagPlayerID=%s not in %s" % (zoneID, tagPlayerID, top8PlayerIDList), playerID) return guessObj = None playerGuessList = pkZoneMgr.GetPlayerGuessList(playerID, guessType) for guess in playerGuessList: if guess.tagPlayerID == tagPlayerID: if guessType == 4: if guess.guessRank != guessRank: GameWorld.ErrLog("ÒѾ­´æÔڸþº²Â£¬µ«ÊDz»ÄÜÐ޸ľº²ÂÃû´Î£¬ÎÞ·¨¾º²Â! zoneID=%s,guessType=%s,tagPlayerID=%s, guessRank(%s) != guess.guessRank(%s)" % (zoneID, guessType, tagPlayerID, guessRank, guess.guessRank), playerID) return guessObj = guess GameWorld.Log("ÒѾ­´æÔڸþº²Â£¬Íæ¼Ò½øÐмÓ×¢! guessInfo=%s" % guess.GetString(), playerID) else: if guessType == 4: if guess.guessRank == guessRank: GameWorld.ErrLog("¸ÃÃû´ÎÒѾ­¾º²ÂÁËÆäËûÍæ¼Ò£¬ÎÞ·¨Öظ´¾º²ÂͬһÃû´Î! zoneID=%s,guessType=%s,tagPlayerID=%s,guessRank=%s,ÒѾ­¾º²Â¹ýµÄÍæ¼ÒID=%s" % (zoneID, guessType, tagPlayerID, guessRank, guess.tagPlayerID), playerID) return guessMoneyAlready = 0 if not guessObj else guessObj.moneyTotal # ÒѾ­¾º²ÂµÄ¶î¶È if guessMoneyAlready + guessMoney > guessMoneyMax: GameWorld.ErrLog("³¬³ö×î´ó¿ÉͶע·ÝÊý¶î¶È£¬ÎÞ·¨¾º²Â! zoneID=%s,guessType=%s,tagPlayerID=%s,guessMoneyAlready=%s,guessMoney=%s,guessMoneyMax=%s" % (zoneID, guessType, tagPlayerID, guessMoneyAlready, guessMoney, guessMoneyMax), playerID) return syncPub = False # ͬ²½¹«¹²ÐÅÏ¢ if not guessObj: if len(playerGuessList) >= guessTagPlayerCountMax: GameWorld.ErrLog("³¬³öÿ¸öÍæ¼Ò×î´ó¾º²ÂÈËÊý£¬ÎÞ·¨¾º²Â! zoneID=%s,guessType=%s,playerGuessListLen=%s >= guessTagPlayerCountMax=%s" % (zoneID, guessType, len(playerGuessList), guessTagPlayerCountMax), playerID) return guessObj = ChampionshipGuess() guessObj.zoneID = zoneID guessObj.guessType = guessType guessObj.guessRank = guessRank guessObj.guessPlayerID = playerID guessObj.tagPlayerID = tagPlayerID guessObj.moneyTotal = 0 # Ͷע×Ü»õ±ÒÖµ playerGuessList.append(guessObj) syncPub = True if guessType not in pkZoneMgr.supportCountInfo: pkZoneMgr.supportCountInfo[guessType] = {} playerSupportCountDict = pkZoneMgr.supportCountInfo[guessType] playerSupportCountDict[tagPlayerID] = playerSupportCountDict.get(tagPlayerID, 0) + 1 superPlayerCount = playerSupportCountDict.get(tagPlayerID, 0) GameWorld.Log("¸üб»¾º²ÂÍæ¼ÒÖ§³ÖÈËÊýÖµ! zoneID=%s,guessType=%s,tagPlayerID=%s,superPlayerCount=%s" % (zoneID, guessType, tagPlayerID, superPlayerCount), playerID) guessObj.moneyTotal += guessMoney GameWorld.Log("¸üоº²Â! zoneID=%s,guessType=%s,tagPlayerID=%s,guessRank=%s,moneyTotal=%s" % (zoneID, guessType, tagPlayerID, guessRank, guessObj.moneyTotal), playerID) Send_CrossServerMsg_ChampionshipGuess(zoneID, playerID, guessObj, serverGroupID, msgData, syncPub=syncPub) return def ClientServerMsg_ChampionshipWorship(serverGroupID, msgData): ## ÊÕµ½×Ó·þÐÅÏ¢ - ¿ç·þÅÅλĤ°Ý zoneID = msgData["zoneID"] playerID = msgData["playerID"] tagPlayerID = msgData["tagPlayerID"] champMgr = GetChampionshipMgr() offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) officialObj = offZoneMgr.GetPlayerOfficial(tagPlayerID) if not officialObj: GameWorld.ErrLog("¸Ã·ÖÇøÄ¿±êÍæ¼ÒûÓйÙÖ°£¬ÎÞ·¨Ä¤°Ý! zoneID=%s,tagPlayerID=%s" % (zoneID, tagPlayerID), playerID) return tagOfficialID = officialObj.officialID mainIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", tagOfficialID) if not mainIpyData: return juniorOfficialIDList = mainIpyData.GetJuniorOfficialIDList() if not juniorOfficialIDList: GameWorld.ErrLog("¸Ã¹ÙÖ°ÎÞϼ¶Ïɹ٣¬ÎÞ·¨Ä¤°Ý! zoneID=%s,tagPlayerID=%s,tagOfficialID=%s" % (zoneID, tagPlayerID, tagOfficialID), playerID) return officialObj.worshipCount += 1 if officialObj.worshipDouble: msgData["worshipDouble"] = 1 syncOfficialIDList = [tagOfficialID] Send_CrossServerMsg_ChampionshipOfficial(zoneID, syncOfficialIDList, exData=msgData) return def ClientServerMsg_ChampionshipOfficialApply(serverGroupID, msgData): ## ÊÕµ½×Ó·þÐÅÏ¢ - ¿ç·þÅÅλÏɹÙÉêÇë zoneID = msgData["zoneID"] playerID = msgData["playerID"] mainOfficialID = msgData["mainOfficialID"] officialID = msgData["officialID"] cancel = msgData["cancel"] PropData = msgData["PropData"] if cancel: champMgr = GetChampionshipMgr() offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) officialObj = offZoneMgr.GetOfficialObj(officialID) if not officialObj: return if playerID not in officialObj.applyPlayerInfo: GameWorld.ErrLog("²»ÔÚÏɹÙÉêÇëÁбíÀï! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID) return officialObj.applyPlayerInfo.pop(playerID, None) Send_CrossServerMsg_ChampionshipOfficial(zoneID, [officialID]) return mainIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", mainOfficialID) if not mainIpyData: return juniorOfficialIDList = mainIpyData.GetJuniorOfficialIDList() if officialID not in juniorOfficialIDList: GameWorld.ErrLog("ÉêÇë¹ÙÖ°ID·Ç¸Ã½çÖ÷ϼ¶¹ÙÖ°£¬ÎÞ·¨ÉêÇë! mainOfficialID=%s,officialID=%s not in %s" % (mainOfficialID, officialID, juniorOfficialIDList), playerID) return ipyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", officialID) if not ipyData: return canBeReplace = ipyData.GetCanBeReplace() if canBeReplace: GameWorld.ErrLog("¿É±»ÌôÕ½µÄ¹ÙÖ°ÎÞ·¨ÉêÇë! mainOfficialID=%s,officialID=%s" % (mainOfficialID, officialID), playerID) return champMgr = GetChampionshipMgr() offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) mainOffObj = offZoneMgr.GetOfficialObj(mainOfficialID) officialObj = offZoneMgr.GetOfficialObj(officialID) if not mainOffObj or not officialObj: return if not mainOffObj.playerID: GameWorld.Log("ÏɹÙËùÊô½çÖ÷ÎÞÍæ¼Ò£¬ÎÞ·¨ÉêÇë! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID) return if officialObj.playerID: GameWorld.Log("ÏɹÙÒÑÓÐÍæ¼ÒÈÎÖ°£¬ÎÞ·¨ÉêÇë! zoneID=%s,mainOfficialID=%s,officialID=%s,offPlayerID=%s" % (zoneID, mainOfficialID, officialID, officialObj.playerID), playerID) return if playerID in officialObj.applyPlayerInfo: GameWorld.Log("ÒѾ­ÉêÇë¹ý¸Ã¹ÙÖ°! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID) return applyPlayerCountMax = IpyGameDataPY.GetFuncCfg("CrossChamOfficial", 1) # ÿ¸ö¹ÙÖ°×î´óÉêÇëÍæ¼ÒÊý if applyPlayerCountMax and len(officialObj.applyPlayerInfo) >= applyPlayerCountMax: GameWorld.Log("¸Ã¹ÙÖ°ÒÑ´ïµ½×î´óÉêÇëÍæ¼ÒÊý! zoneID=%s,mainOfficialID=%s,officialID=%s,applyPlayerIDList=%s,applyPlayerCountMax=%s" % (zoneID, mainOfficialID, officialID, officialObj.applyPlayerInfo.keys(), applyPlayerCountMax), playerID) PlayerControl.NotifyCodeCross(serverGroupID, playerID, "ChampionshipOfficialApplyFull") return playerApplyOfficialIDList = [] for offID in offZoneMgr.officialInfo.keys(): offObj = offZoneMgr.GetOfficialObj(offID) if not offObj: continue if offObj.playerID == playerID: GameWorld.ErrLog("Íæ¼ÒÒѾ­ÓÐÈÎÖ°¹ÙÖ°£¬ÎÞ·¨ÉêÇëÆäËû¹ÙÖ°! zoneID=%s,player officialID=%s" % (zoneID, offID), playerID) PlayerControl.NotifyCodeCross(serverGroupID, playerID, "ChampionshipAlreadyHasOfficial") return if playerID in offObj.applyPlayerInfo: playerApplyOfficialIDList.append(offID) playerApplyCountMax = IpyGameDataPY.GetFuncCfg("CrossChamOfficial", 2) # ÿ¸öÍæ¼Ò×î´ó¿ÉͬʱÉêÇë¹ÙÖ°Êý if playerApplyCountMax and len(playerApplyOfficialIDList) >= playerApplyCountMax: GameWorld.Log("Íæ¼ÒÒѴﵽͬʱÉêÇë¹ÙÖ°×î´óÊý! zoneID=%s,mainOfficialID=%s,officialID=%s,playerApplyOfficialIDList=%s,playerApplyCountMax=%s" % (zoneID, mainOfficialID, officialID, playerApplyOfficialIDList, playerApplyCountMax), playerID) PlayerControl.NotifyCodeCross(serverGroupID, playerID, "ChampionshipOfficialApplyMax") return # ¸üÐÂû½øÈë¿ç·þµÄÍæ¼Ò»º´æÐÅÏ¢ PlayerViewCache.FindViewCache(playerID, True, PropData) officialObj.applyPlayerInfo[playerID] = PropData Send_CrossServerMsg_ChampionshipOfficial(zoneID, [officialID]) PlayerControl.NotifyCodeCross(serverGroupID, playerID, "ChampionshipOfficialApplyOK") return #// C0 21 ¿ç·þÅÅλÏɹÙÉêÇë»ØÓ¦ #tagCGChampionshipOfficialApplyReply # #struct tagCGChampionshipOfficialApplyReply #{ # tagHead Head; # WORD MainOfficialID; //½çÖ÷¹ÙÖ°ID # WORD OfficialID; //ÉêÇë¹ÙÖ°ID # DWORD PlayerID; //ÉêÇëµÄÍæ¼ÒID # BYTE IsOK; //ÊÇ·ñͬÒ⣻1-ÊÇ£»0-·ñ #}; def OnChampionshipOfficialApplyReply(index, clientData, tick): if GameWorld.IsCrossServer(): return curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() mainOfficialID = clientData.MainOfficialID officialID = clientData.OfficialID applyPlayerID = clientData.PlayerID isOK = clientData.IsOK champMgr = GetChampionshipMgr() zoneID = champMgr.GetPlayerOfficialZoneID(playerID) if not zoneID: return sendMsg = {"zoneID":zoneID, "playerID":playerID, "mainOfficialID":mainOfficialID, "officialID":officialID, "applyPlayerID":applyPlayerID, "isOK":isOK} CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChampionshipOfficialApplyReply, sendMsg) return def ClientServerMsg_ChampionshipOfficialApplyReply(serverGroupID, msgData): ## ÊÕµ½×Ó·þÐÅÏ¢ - ¿ç·þÅÅλÏɹÙÉêÇë»ØÓ¦ zoneID = msgData["zoneID"] playerID = msgData["playerID"] mainOfficialID = msgData["mainOfficialID"] officialID = msgData["officialID"] applyPlayerID = msgData["applyPlayerID"] isOK = msgData["isOK"] champMgr = GetChampionshipMgr() offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) mainOffObj = offZoneMgr.GetOfficialObj(mainOfficialID) officialObj = offZoneMgr.GetOfficialObj(officialID) if not mainOffObj: return if not officialObj: return if mainOffObj.playerID != playerID: GameWorld.ErrLog("·Ç½çÖ÷£¬ÎÞ·¨»ØÓ¦ÏɹÙÉêÇë! zoneID=%s,mainOfficialID=%s,mainOffPlayerID=%s" % (zoneID, mainOfficialID, mainOffObj.playerID), playerID) return if applyPlayerID not in officialObj.applyPlayerInfo: GameWorld.Log("Íæ¼ÒûÓÐÔÚ¸ÃÏɹÙÉêÇëÁбíÀ²»ÐèÒª»ØÓ¦! zoneID=%s,mainOfficialID=%s,officialID=%s,applyPlayerID=%s not in applyPlayerIDList=%s" % (zoneID, mainOfficialID, officialID, applyPlayerID, officialObj.applyPlayerInfo.keys()), playerID) return replyDict = {applyPlayerID:isOK} # »ØÓ¦½á¹û {playerID:isOK, ...} syncOfficialIDList = [officialID] officialObj.applyPlayerInfo.pop(applyPlayerID) # ͬÒâ if isOK: applyPlayerOffID = 0 # ÒÆ³ý¸ÃÍæ¼ÒµÄÆäËûÏɹÙÉêÇë for offID in offZoneMgr.officialInfo.keys(): offObj = offZoneMgr.GetOfficialObj(offID) if not offObj: continue if offObj.playerID == applyPlayerID: applyPlayerOffID = offID syncOfficialIDList.append(offID) if applyPlayerID in offObj.applyPlayerInfo: offObj.applyPlayerInfo.pop(applyPlayerID) syncOfficialIDList.append(offID) if applyPlayerOffID: GameWorld.ErrLog("ͬÒâÍæ¼Ò¹ÙÖ°ÉêÇëʱ£¬ÉêÇë¹ÙÖ°Íæ¼ÒÒѾ­ÈÎÖ°ÆäËû¹ÙÖ°£¬²»´¦Àí£¡ zoneID=%s,applyPlayerID=%s,applyPlayerOffID=%s" % (zoneID, applyPlayerID, applyPlayerOffID), playerID) else: officialObj.playerID = applyPlayerID # ĬÈϾܾøÆäËûÉêÇëÕß for refusePlayerID in officialObj.applyPlayerInfo.keys(): replyDict[refusePlayerID] = 0 officialObj.applyPlayerInfo = {} else: pass exData = {"exDataType":"OfficialApplyReply", "mainPlayerName":mainOffObj.playerName, "replyDict":replyDict, "mainOfficialID":mainOfficialID, "officialID":officialID} Send_CrossServerMsg_ChampionshipOfficial(zoneID, syncOfficialIDList, exData=exData) return def ClientServerMsg_ChampionshipOfficialChallenge(serverGroupID, msgData): ## ÊÕµ½×Ó·þÐÅÏ¢ - ÏɹÙÌôÕ½ zoneID = msgData["zoneID"] playerID = msgData["playerID"] mainOfficialID = msgData["mainOfficialID"] officialID = msgData["officialID"] tagPlayerID = msgData["tagPlayerID"] PropData = msgData["PropData"] if playerID == tagPlayerID: GameWorld.ErrLog("ÌôÕ½Ïɹٲ»ÄÜÌôÕ½×Ô¼º! mainOfficialID=%s,officialID=%s" % (mainOfficialID, officialID), playerID) return mainIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", mainOfficialID) if not mainIpyData: return juniorOfficialIDList = mainIpyData.GetJuniorOfficialIDList() if officialID not in juniorOfficialIDList: GameWorld.ErrLog("ÉêÇë¹ÙÖ°ID·Ç¸Ã½çÖ÷ϼ¶¹ÙÖ°£¬ÎÞ·¨ÌôÕ½! mainOfficialID=%s,officialID=%s not in %s" % (mainOfficialID, officialID, juniorOfficialIDList), playerID) return ipyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", officialID) if not ipyData: return canBeReplace = ipyData.GetCanBeReplace() if not canBeReplace: GameWorld.ErrLog("¸ÃÏɹÙÎÞ·¨±»ÌôÕ½Ìæ»»! mainOfficialID=%s,officialID=%s" % (mainOfficialID, officialID), playerID) return champMgr = GetChampionshipMgr() offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) mainOffObj = offZoneMgr.GetOfficialObj(mainOfficialID) officialObj = offZoneMgr.GetOfficialObj(officialID) if not mainOffObj or not officialObj: return if not mainOffObj.playerID: GameWorld.Log("ÏɹÙËùÊô½çÖ÷ÎÞÍæ¼Ò£¬ÎÞ·¨ÌôÕ½! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID) return for offID in offZoneMgr.officialInfo.keys(): offObj = offZoneMgr.GetOfficialObj(offID) if not offObj: continue if offObj.playerID == playerID: GameWorld.ErrLog("Íæ¼ÒÒѾ­ÓÐÈÎÖ°¹ÙÖ°£¬ÎÞ·¨ÌôÕ½ÆäËû¹ÙÖ°! zoneID=%s, player officialID=%s" % (zoneID, offID), playerID) PlayerControl.NotifyCodeCross(serverGroupID, playerID, "ChampionshipAlreadyHasOfficial") return Ret = 0 # ÌôÕ½½á¹û£»0-ʧ°Ü£»1-»ñʤ£»2-Ä¿±êÏɹÙÍæ¼ÒIDÒѱä¸ü£¬¿ÉˢкóÖØÊÔ offPlayerID = officialObj.playerID if not offPlayerID: GameWorld.Log("ÌôսĿ±êÏɹÙÎÞÍæ¼ÒÈÎÖ°£¬Ö±½Ó»ñʤ! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID) Ret = 1 elif offPlayerID != tagPlayerID: GameWorld.Log("ÌôսĿ±êÏɹÙÍæ¼ÒIDÒѱä¸ü£¬ÐèҪˢкóÖØÐÂÌôÕ½! zoneID=%s,mainOfficialID=%s,officialID=%s,offPlayerID(%s) != tagPlayerID(%s)" % (zoneID, mainOfficialID, officialID, offPlayerID, tagPlayerID), playerID) Ret = 2 else: fightPower = PropData.get("FightPower", 0) tagFightPower = officialObj.fightPower Ret = 1 if fightPower > tagFightPower else 0 GameWorld.Log("ÌôսĿ±êÏɹÙÍæ¼ÒID½á¹û! zoneID=%s,mainOfficialID=%s,officialID=%s,fightPower=%s,tagFightPower=%s,tagPlayerID=%s,Ret=%s" % (zoneID, mainOfficialID, officialID, fightPower, tagFightPower, tagPlayerID, Ret), playerID) syncOfficialIDList = [officialID] playerName = PropData.get("Name", str(playerID)) # ÔÝʱֻ¼Ç¼ÌôսʤÀûµÄ if Ret == 1: officialObj.challengeList.append({"Time":int(time.time()), "Ret":Ret, "Name":playerName, "AccID":PropData.get("AccID", ""), }) # Ö»±£Áô×î½ü5Ìõ¼þ¼Ç¼ if len(officialObj.challengeList) > 5: officialObj.challengeList.pop(0) # ¸üÐÂû½øÈë¿ç·þµÄÍæ¼Ò»º´æÐÅÏ¢ PlayerViewCache.FindViewCache(playerID, True, PropData) # ¸üÐÂÈÎÖ°Íæ¼ÒID officialObj.ResetPlayer() officialObj.playerID = playerID # ÒÆ³ý¸ÃÍæ¼ÒµÄÆäËûÏɹÙÉêÇë for offID in offZoneMgr.officialInfo.keys(): offObj = offZoneMgr.GetOfficialObj(offID) if not offObj: continue if playerID in offObj.applyPlayerInfo: offObj.applyPlayerInfo.pop(playerID) syncOfficialIDList.append(offID) # Óʼþ֪ͨ¶Ô·½£¬¹ÙÖ°±»ÌôÕ½ÁË if offPlayerID: PlayerCompensation.SendMailByKey("CrossChampionshipOfficialBeChallenge", [offPlayerID], [], [playerName, officialID], crossMail=True) exData = {"exDataType":"OfficialChallenge", "playerID":playerID, "tagPlayerName":officialObj.playerName, "mainOfficialID":mainOfficialID, "officialID":officialID, "Ret":Ret} Send_CrossServerMsg_ChampionshipOfficial(zoneID, syncOfficialIDList, exData=exData) return #// C0 23 ¿ç·þÅÅλÏɹÙÌôÕ½¼Ç¼²éѯ #tagCGChampionshipOfficialChallengeQuery # #struct tagCGChampionshipOfficialChallengeQuery #{ # tagHead Head; # WORD MainOfficialID; //½çÖ÷¹ÙÖ°ID # WORD OfficialID; //²éѯ¹ÙÖ°ID #}; def OnChampionshipOfficialChallengeQuery(index, clientData, tick): if GameWorld.IsCrossServer(): return curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() mainOfficialID = clientData.MainOfficialID officialID = clientData.OfficialID champMgr = GetChampionshipMgr() zoneID = champMgr.GetPlayerOfficialZoneID(playerID) if not zoneID: return offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) officialObj = offZoneMgr.GetOfficialObj(officialID) challengeList = officialObj.challengeList if officialObj else [] clientPack = ChPyNetSendPack.tagGCChampionshipOfficialChallengeRecordInfo() clientPack.ZoneID = zoneID clientPack.MainOfficialID = mainOfficialID clientPack.OfficialID = officialID clientPack.RecordList = [] for challengeDict in challengeList: recordPack = ChPyNetSendPack.tagGCChampionshipOfficialChallengeRecord() recordPack.PlayerName = challengeDict.get("Name", "") recordPack.NameLen = len(recordPack.PlayerName) recordPack.ChallengeTime = challengeDict.get("Time", 0) recordPack.Ret = challengeDict.get("Ret", 0) clientPack.RecordList.append(recordPack) clientPack.RecordCount = len(clientPack.RecordList) NetPackCommon.SendFakePack(curPlayer, clientPack) return #// C0 24 ¿ç·þÅÅλ´ÇÍËϼ¶Ïɹ٠#tagCGChampionshipOfficialKick # #struct tagCGChampionshipOfficialKick #{ # tagHead Head; # WORD MainOfficialID; //½çÖ÷¹ÙÖ°ID # WORD OfficialID; //Ä¿±ê¹ÙÖ°ID # DWORD PlayerID; //Ä¿±êÍæ¼ÒID #}; def OnChampionshipOfficialKick(index, clientData, tick): if GameWorld.IsCrossServer(): return curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() mainOfficialID = clientData.MainOfficialID officialID = clientData.OfficialID tagPlayerID = clientData.PlayerID champMgr = GetChampionshipMgr() zoneID = champMgr.GetPlayerOfficialZoneID(playerID) if not zoneID: return sendMsg = {"zoneID":zoneID, "playerID":playerID, "mainOfficialID":mainOfficialID, "officialID":officialID, "tagPlayerID":tagPlayerID, "playerName":CrossRealmPlayer.GetCrossPlayerName(curPlayer)} CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChampionshipOfficialKick, sendMsg) return def ClientServerMsg_ChampionshipOfficialKick(serverGroupID, msgData): ## ÊÕµ½×Ó·þÐÅÏ¢ - ¿ç·þÅÅλ´ÇÍËϼ¶Ïɹ٠zoneID = msgData["zoneID"] playerID = msgData["playerID"] playerName = msgData["playerName"] mainOfficialID = msgData["mainOfficialID"] officialID = msgData["officialID"] tagPlayerID = msgData["tagPlayerID"] mainIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", mainOfficialID) if not mainIpyData: return juniorOfficialIDList = mainIpyData.GetJuniorOfficialIDList() if officialID not in juniorOfficialIDList: GameWorld.ErrLog("¹ÙÖ°ID·Ç¸Ã½çÖ÷ϼ¶¹ÙÖ°£¬ÎÞ·¨´ÇÍË! mainOfficialID=%s,officialID=%s not in %s" % (mainOfficialID, officialID, juniorOfficialIDList), playerID) return champMgr = GetChampionshipMgr() offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) mainOffObj = offZoneMgr.GetOfficialObj(mainOfficialID) officialObj = offZoneMgr.GetOfficialObj(officialID) if not mainOffObj: return if not officialObj: return if mainOffObj.playerID != playerID: GameWorld.ErrLog("·Ç½çÖ÷£¬ÎÞ·¨´ÇÍËϼ¶ÏɹÙ! zoneID=%s,mainOfficialID=%s,mainOffPlayerID=%s" % (zoneID, mainOfficialID, mainOffObj.playerID), playerID) return if not officialObj.playerID or officialObj.playerID != tagPlayerID: GameWorld.Log("µ±Ç°ÏɹÙÍæ¼ÒID·ÇÄ¿±êÍæ¼ÒID£¬ÎÞ·¨´ÇÍË! zoneID=%s,mainOfficialID=%s,officialID=%s,offPlayerID(%s) != tagPlayerID(%s)" % (zoneID, mainOfficialID, officialID, officialObj.playerID, tagPlayerID), playerID) return kickCD = IpyGameDataPY.GetFuncCfg("CrossChamOfficial", 4) # ´ÇÍËϼ¶Ïɹٹ«¹²CD£¬Ãë if kickCD: curTime = int(time.time()) passSeconds = curTime - mainOffObj.lastDismissJuniorTime if passSeconds < kickCD: GameWorld.ErrLog("½çÖ÷´ÇÍËϼ¶ÏɹÙCDÖÐ! zoneID=%s,mainOfficialID=%s,passSeconds(%s) < %s" % (zoneID, mainOfficialID, passSeconds, kickCD), playerID) return mainOffObj.lastDismissJuniorTime = curTime officialObj.ResetPlayer() # ´ÇÍËÖØÖà if tagPlayerID: # Óʼþ֪ͨ¶Ô·½£¬¹ÙÖ°±»´ÇÍËÁË PlayerCompensation.SendMailByKey("CrossChampionshipOfficialBeKick", [tagPlayerID], [], [playerName, officialID], crossMail=True) syncOfficialIDList = [mainOfficialID, officialID] Send_CrossServerMsg_ChampionshipOfficial(zoneID, syncOfficialIDList) return #// C0 25 ¿ç·þÅÅλÖ÷¶¯ÀëÈÎÏɹ٠#tagCGChampionshipOfficialLeave # #struct tagCGChampionshipOfficialLeave #{ # tagHead Head; # WORD MainOfficialID; //½çÖ÷¹ÙÖ°ID # WORD OfficialID; //ÀëÈιÙÖ°ID #}; def OnChampionshipOfficialLeave(index, clientData, tick): if GameWorld.IsCrossServer(): return curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() mainOfficialID = clientData.MainOfficialID officialID = clientData.OfficialID champMgr = GetChampionshipMgr() zoneID = champMgr.GetPlayerOfficialZoneID(playerID) if not zoneID: return sendMsg = {"zoneID":zoneID, "playerID":playerID, "mainOfficialID":mainOfficialID, "officialID":officialID} CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChampionshipOfficialLeave, sendMsg) return def ClientServerMsg_ChampionshipOfficialLeave(serverGroupID, msgData): ## ÊÕµ½×Ó·þÐÅÏ¢ - ¿ç·þÅÅλÖ÷¶¯ÀëÈÎÏɹ٠zoneID = msgData["zoneID"] playerID = msgData["playerID"] mainOfficialID = msgData["mainOfficialID"] officialID = msgData["officialID"] mainIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", mainOfficialID) if not mainIpyData: return juniorOfficialIDList = mainIpyData.GetJuniorOfficialIDList() if officialID not in juniorOfficialIDList: GameWorld.ErrLog("¹ÙÖ°ID·Ç¸Ã½çÖ÷ϼ¶¹ÙÖ°£¬ÎÞ·¨Ö÷¶¯ÀëÈÎÏɹÙ! mainOfficialID=%s,officialID=%s not in %s" % (mainOfficialID, officialID, juniorOfficialIDList), playerID) return champMgr = GetChampionshipMgr() offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) officialObj = offZoneMgr.GetOfficialObj(officialID) if not officialObj: return if not officialObj.playerID or officialObj.playerID != playerID: GameWorld.Log("·Ç±¾ÏɹÙÍæ¼ÒID£¬ÎÞ·¨Ö÷¶¯ÀëÈÎÏɹÙ! zoneID=%s,mainOfficialID=%s,officialID=%s,offPlayerID(%s) != playerID(%s)" % (zoneID, mainOfficialID, officialID, officialObj.playerID, playerID), playerID) return officialObj.ResetPlayer() # ÀëÈÎÖØÖà syncOfficialIDList = [officialID] Send_CrossServerMsg_ChampionshipOfficial(zoneID, syncOfficialIDList) return def Sync_ChampionshipPKZoneGroupInfo(zoneID, groupMarkDict=None, curPlayer=None): ## ͬ²½ÅÅλ·ÖÇø·Ö×éÐÅÏ¢ # @param groupMarkDict: {groupMark:[battleNum, ...], ...} champMgr = GetChampionshipMgr() if curPlayer: playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID()) if playerZoneID != zoneID: return if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): return pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: return if groupMarkDict == None: groupMarkDict = {} for groupMark, groupDict in pkZoneMgr.battleInfo.items(): groupMarkDict[groupMark] = groupDict.keys() playerIDList = pkZoneMgr.GetBatPlayerIDList() else: playerIDList = [] for groupMark, battleNumList in groupMarkDict.items(): for battleNum in battleNumList: battleObj = pkZoneMgr.GetBattle(groupMark, battleNum) if not battleObj: continue if battleObj.playerIDA not in playerIDList: playerIDList.append(battleObj.playerIDA) if battleObj.playerIDB not in playerIDList: playerIDList.append(battleObj.playerIDB) clientPack = ChPyNetSendPack.tagGCCrossChampionshipPKZoneGroupInfo() clientPack.ActID = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID) clientPack.StateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError) clientPack.ZoneID = zoneID clientPack.GroupList = [] for groupMark, battleNumList in groupMarkDict.items(): groupPack = ChPyNetSendPack.tagGCCrossChampionshipPKGroup() groupPack.GroupMark = groupMark groupPack.BattleList = [] for battleNum in battleNumList: battleObj = pkZoneMgr.GetBattle(groupMark, battleNum) if not battleObj: continue battlePack = ChPyNetSendPack.tagGCCrossChampionshipPKBattle() battlePack.BattleNum = battleNum battlePack.WinPlayerID = battleObj.winPlayerID battlePack.PlayerIDA = battleObj.playerIDA battlePack.PlayerIDB = battleObj.playerIDB groupPack.BattleList.append(battlePack) groupPack.BattleCount = len(groupPack.BattleList) clientPack.GroupList.append(groupPack) clientPack.GroupCount = len(clientPack.GroupList) clientPack.PlayerList = [] for playerID in playerIDList: batPlayer = pkZoneMgr.GetBatPlayer(playerID) if not batPlayer: continue playerPack = ChPyNetSendPack.tagGCCrossChampionshipPKPlayer() playerPack.PlayerID = playerID playerPack.PlayerName = batPlayer.playerName playerPack.NameLen = len(playerPack.PlayerName) playerPack.Job = batPlayer.job playerPack.LV = batPlayer.lv playerPack.FightPower = batPlayer.fightPower % ShareDefine.Def_PerPointValue playerPack.FightPowerEx = batPlayer.fightPower / ShareDefine.Def_PerPointValue playerPack.RealmLV = batPlayer.realmLV clientPack.PlayerList.append(playerPack) clientPack.PlayerCount = len(clientPack.PlayerList) if curPlayer != None: NetPackCommon.SendFakePack(curPlayer, clientPack) else: playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(i) if curPlayer == None or not curPlayer.GetInitOK(): continue playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID()) if playerZoneID != zoneID: continue if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): continue NetPackCommon.SendFakePack(curPlayer, clientPack) return def Sync_ChampionshipGuessPriInfo(curPlayer, syncKeyInfo=None): ## ͬ²½ÅÅλ·ÖÇø¾º²Â¸öÈËÐÅÏ¢ # @param syncKeyInfo: Ö¸¶¨Í¬²½µÄ {guessType:[tagPlayerID, ...], ...} playerID = curPlayer.GetPlayerID() champMgr = GetChampionshipMgr() playerZoneID = champMgr.GetPlayerPKZoneID(playerID) if not playerZoneID: return if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): return pkZoneMgr = champMgr.GetChampPKZoneMgr(playerZoneID) if not pkZoneMgr: return clientPack = ChPyNetSendPack.tagGCChampionshipGuessPriInfo() clientPack.ZoneID = playerZoneID clientPack.GuessList = [] for guessType, playerGuessDict in pkZoneMgr.guessInfo.items(): if syncKeyInfo and guessType not in syncKeyInfo: continue syncTagPlayerIDList = [] if not syncKeyInfo else syncKeyInfo.get(guessType, []) priListPack = ChPyNetSendPack.tagGCChampionshipGuessPriList() priListPack.GuessType = guessType priListPack.GuessPlayerList = [] playerGuessList = playerGuessDict.get(playerID, []) for guess in playerGuessList: tagPlayerID = guess.tagPlayerID if syncTagPlayerIDList and tagPlayerID not in syncTagPlayerIDList: continue priPlayerPack = ChPyNetSendPack.tagGCChampionshipGuessPlayerPri() priPlayerPack.PlayerID = tagPlayerID priPlayerPack.MoneyTotal = guess.moneyTotal priPlayerPack.GuessRank = guess.guessRank priListPack.GuessPlayerList.append(priPlayerPack) priListPack.PlayerCount = len(priListPack.GuessPlayerList) clientPack.GuessList.append(priListPack) clientPack.Count = len(clientPack.GuessList) NetPackCommon.SendFakePack(curPlayer, clientPack) return def Sync_ChampionshipGuessPubInfo(zoneID, curPlayer=None, syncKeyInfo=None): ## ͬ²½ÅÅλ·ÖÇø¾º²Â¹«¹²ÐÅÏ¢ # @param syncKeyInfo: Ö¸¶¨Í¬²½µÄ {guessType:[tagPlayerID, ...], ...} champMgr = GetChampionshipMgr() if curPlayer: playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID()) if playerZoneID != zoneID: return if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): return pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: return # ¹«¹²¾º²ÂÐÅÏ¢ clientPack = ChPyNetSendPack.tagGCChampionshipGuessPubInfo() clientPack.ZoneID = zoneID clientPack.GuessList = [] for guessType, playerSupportCountDict in pkZoneMgr.supportCountInfo.items(): if syncKeyInfo and guessType not in syncKeyInfo: continue syncTagPlayerIDList = [] if not syncKeyInfo else syncKeyInfo.get(guessType, []) pubListPack = ChPyNetSendPack.tagGCChampionshipGuessPubList() pubListPack.GuessType = guessType pubListPack.GuessPlayerList = [] for tagPlayerID, supportCount in playerSupportCountDict.items(): if syncTagPlayerIDList and tagPlayerID not in syncTagPlayerIDList: continue pubPlayerPack = ChPyNetSendPack.tagGCChampionshipGuessPlayerPub() pubPlayerPack.PlayerID = tagPlayerID pubPlayerPack.SupportCount = supportCount pubListPack.GuessPlayerList.append(pubPlayerPack) pubListPack.PlayerCount = len(pubListPack.GuessPlayerList) clientPack.GuessList.append(pubListPack) clientPack.Count = len(clientPack.GuessList) if curPlayer != None: NetPackCommon.SendFakePack(curPlayer, clientPack) else: playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(i) if curPlayer == None or not curPlayer.GetInitOK(): continue playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID()) if playerZoneID != zoneID: continue if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): continue NetPackCommon.SendFakePack(curPlayer, clientPack) return def Sync_ChampionshipOfficialInfo(zoneID, officialIDList=None, curPlayer=None): ## ͬ²½ÅÅλ·ÖÇø¹ÙÖ°ÐÅÏ¢ # @param officialIDList: [officialID, ...] champMgr = GetChampionshipMgr() if curPlayer: playerZoneID = champMgr.GetPlayerOfficialZoneID(curPlayer.GetPlayerID()) if playerZoneID != zoneID: return if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): return clientPack = ChPyNetSendPack.tagGCChampionshipOfficialInfo() clientPack.ZoneID = zoneID clientPack.OfficialList = [] offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) if officialIDList == None: officialIDList = offZoneMgr.officialInfo.keys() for officialID in officialIDList: offObj = offZoneMgr.GetOfficialObj(officialID) if not offObj: continue offPlayer = ChPyNetSendPack.tagGCChampionshipOfficialPlayer() offPlayer.PlayerID = offObj.playerID offPlayer.PlayerName = offObj.playerName offPlayer.NameLen = len(offPlayer.PlayerName) offPlayer.Job = offObj.job offPlayer.LV = offObj.lv offPlayer.FightPower = offObj.fightPower % ShareDefine.Def_PerPointValue offPlayer.FightPowerEx = offObj.fightPower / ShareDefine.Def_PerPointValue offPlayer.RealmLV = offObj.realmLV offPack = ChPyNetSendPack.tagGCChampionshipOfficial() offPack.OfficialID = officialID offPack.LastDismissJuniorTime = offObj.lastDismissJuniorTime offPack.WorshipCount = offObj.worshipCount offPack.WorshipDouble = offObj.worshipDouble offPack.OfficialPlayer = offPlayer offPack.ApplyPlayerList = [] for applyPlayerID, playerInfo in offObj.applyPlayerInfo.items(): applyPlayer = ChPyNetSendPack.tagGCChampionshipOfficialPlayer() applyPlayer.PlayerID = applyPlayerID applyPlayer.PlayerName = playerInfo.get("Name", "") applyPlayer.NameLen = len(applyPlayer.PlayerName) applyPlayer.Job = playerInfo.get("Job", 1) applyPlayer.LV = playerInfo.get("LV", 1) fightPower = playerInfo.get("FightPower", 0) applyPlayer.FightPower = fightPower % ShareDefine.Def_PerPointValue applyPlayer.FightPowerEx = fightPower / ShareDefine.Def_PerPointValue applyPlayer.RealmLV = playerInfo.get("RealmLV", 1) offPack.ApplyPlayerList.append(applyPlayer) offPack.ApplyPlayerCount = len(offPack.ApplyPlayerList) clientPack.OfficialList.append(offPack) clientPack.OfficialCount = len(clientPack.OfficialList) if curPlayer != None: NetPackCommon.SendFakePack(curPlayer, clientPack) else: playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(i) if curPlayer == None or not curPlayer.GetInitOK(): continue playerZoneID = champMgr.GetPlayerOfficialZoneID(curPlayer.GetPlayerID()) if playerZoneID != zoneID: continue if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): continue NetPackCommon.SendFakePack(curPlayer, clientPack) return def DR_CrossChampionshipPK(eventName, dataDict={}): drDataDict = {} drDataDict.update(dataDict) DataRecordPack.SendEventPack("CrossChampionship_%s" % eventName, drDataDict) return