#!/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 GameXiangong import GameWorship import PyGameData import ChConfig import PlayerFB import datetime import random import time import json 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 strValue3:battleDict ¾µÏñPK³¡´Î½á¹û {"Íæ¼ÒID":[[µÚ1³¡Ê¤¸º,¼Ó»ý·Ö,...], ...], ...} ''' 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:¹ÙÖ°ID ¹ÙÖ°ID value2:playerID Íæ¼ÒID£¬¿ÉÄÜΪ0 value3:worshipValue ±»Ä¤°Ý´ÎÊý*10 + ÊÇ·ñË«±¶ value4:rank ÅÅÃû value5:zoneID ·ÖÇøID StrValue3: [ÉêÇë¸Ã¹ÙÖ°Íæ¼ÒID,...] ''' Def_RecType_CrossChampionshipOffChallenge = ShareDefine.Def_UniversalGameRecType_CrossChampionshipOffChallenge ''' ¿ç·þÅÅλÕù°ÔÈü¹ÙÖ°ÌôÕ½ÐÅÏ¢ ShareDefine.Def_UniversalGameRecType_CrossChampionshipOffChallenge value1:¹ÙÖ°ID ¹ÙÖ°ID value2:zoneID ·ÖÇø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 self.face = 0 self.facePic = 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) playerShortInfo["Face"] = cacheDict.get("Face", 0) playerShortInfo["FacePic"] = cacheDict.get("FacePic", 0) self.applyPlayerInfo[applyPlayerID] = playerShortInfo return {"zoneID":self.zoneID, "officialID":self.officialID, "lastDismissJuniorTime":self.lastDismissJuniorTime, "accID":self.accID, "playerID":self.playerID, "playerName":self.playerName, "face":self.face, "facePic":self.facePic, "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 self.face = 0 self.facePic = 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, "face":self.face, "facePic":self.facePic} 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.playerBatDict = {} # ¾µÏñPK³¡´Î½á¹û {"Íæ¼ÒID":[[µÚ1³¡Ê¤¸º,¼Ó»ý·Ö,...], ...], ...} # ²»´æµµ 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, "playerBatDict":self.playerBatDict} 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 not battle and False: battle = ChampionshipBattle() return battle def GetBattleByPlayerID(self, groupMark, playerID): battle = None if groupMark in self.battleInfo: battleDict = self.battleInfo[groupMark] for bat in battleDict.values(): if playerID == bat.playerIDA or playerID == bat.playerIDB: battle = bat break if not battle: GameWorld.Log("Î޸ÿç·þÅÅλÕù°ÔÈü¶ÔÕ½³¡´ÎÐÅÏ¢: groupMark=%s,playerID=%s" % (groupMark, playerID)) # ²»¿ÉÄÜÖ´ÐеĴúÂ룬·½±ã . ³öÌáʾ´úÂë if not battle and 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 packDataObj = PyDataManager.GetDBPlayerPackDataManager().GetPlayerPackObj(playerID) # Èç¹ûÓдò°üÊý¾Ý£¬ÒÔ´ò°üÊý¾ÝΪ׼ if packDataObj: obj.accID = packDataObj.accID obj.playerName = packDataObj.playerName obj.job = packDataObj.job obj.lv = packDataObj.lv obj.fightPower = packDataObj.fightPower obj.realmLV = packDataObj.realmLV obj.face = packDataObj.face obj.facePic = packDataObj.facePic 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) obj.face = cacheDict.get("Face", obj.face) obj.facePic = cacheDict.get("FacePic", obj.facePic) 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() strValue3 = recData.GetStrValue3() try: playerBatDict = eval(strValue3) if strValue3 else {} except: playerBatDict = {} #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 battle.playerBatDict = playerBatDict 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() officialID = recData.GetValue1() zoneID = recData.GetValue5() 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) officialID = recData.GetValue1() zoneID = recData.GetValue2() 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) strValue3 = "%s" % batObj.playerBatDict strValue3 = strValue3.replace(" ", "") recData.SetStrValue3(strValue3) 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 recData = officialRecDataList.AddRec() recData.SetTime(offObj.lastDismissJuniorTime) recData.SetValue1(officialID) recData.SetValue2(offObj.playerID) recData.SetValue3(offObj.worshipCount * 10 + offObj.worshipDouble) recData.SetValue4(offObj.rank) recData.SetValue5(zoneID) 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(officialID) challRecData.SetValue2(zoneID) 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=None): if not GameWorld.IsCrossServer(): return Dispose_CrossChampionshipState() # ÿ°ëСʱ´æµµÒ»´Î if curMinute != None and 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: crossBillboardMgr = PyDataManager.GetCrossBillboardManager() for zoneID in hisZoneIDList: groupValue1, groupValue2 = zoneID, championshipSeason billboardObj = crossBillboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_CrossRealmPK, groupValue1, groupValue2) billboardDataLen = billboardObj.GetCount() GameWorld.Log("zoneID=%s,championshipSeason=%s,billboardDataLen=%s" % (zoneID, championshipSeason, billboardDataLen)) if not billboardDataLen: # ûÓÐÍæ¼ÒÉϰñµÄ²»´¦Àí continue pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) for index in range(Def_CrossChampionshipPlayerMax): if index >= billboardDataLen: break billboardData = billboardObj.At(index) playerID = billboardData.ID batPlayer = ChampionshipBatPlayer() batPlayer.zoneID = zoneID batPlayer.playerID = playerID 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 index=%s,playerID=%s,accID=%s,fightPower=%s" % (index, 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): ## ¿ªÆô½ø³¡´¦ÀíÂß¼­ # ¸ÄΪ¾µÏñÕ½¶·£¬·ÏÆú¿ªµØÍ¼·¿¼ä 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) OnMapServerInitOK() return def OnMapServerInitOK(): # ֪ͨµØÍ¼·þÎñÆ÷״̬ if GameWorld.IsCrossServer(): return State = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState) StateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError) GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossChampionshipState, State) GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossChampionshipStateError, StateError) 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: for zoneID in zoneBatPlayerInfo.keys(): 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 DoBattleOverLogic(zoneID, groupMark, battleNum): ## Ö´ÐжÔÕ½½áËãÂß¼­ 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 roomID = GetChampionshipPKRoomID(zoneID, groupMark, battleNum) # ¸Ä°æºó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) winnerID, loserID = 0, 0 if playerIDA and playerIDB: totalScoreDict = {} for batPlayerID, batRetList in battleObj.playerBatDict.items(): for retInfo in batRetList: if not retInfo or len(retInfo) < 2: continue addScore = retInfo[1] totalScoreDict[batPlayerID] = totalScoreDict.get(batPlayerID, 0) + addScore playerScoreA = totalScoreDict.get(playerIDA, 0) playerScoreB = totalScoreDict.get(playerIDB, 0) GameWorld.Log(" ×Ü»ý·Ö: %s, %s" % (totalScoreDict, battleObj.playerBatDict), roomID) if playerScoreA > playerScoreB: winnerID = playerIDA loserID = playerIDB GameWorld.Log(" ¿ç·þÅÅλÈüÍæ¼ÒÀÛ¼Æ×Ü·Ö¸ßÕß»ñʤ! winner is playerIDA=%s,loserID=%s" % (playerIDA, loserID), roomID) elif playerScoreB > playerScoreA: winnerID = playerIDB loserID = playerIDA GameWorld.Log(" ¿ç·þÅÅλÈüÍæ¼ÒÀÛ¼Æ×Ü·Ö¸ßÕß»ñʤ! winner is playerIDB=%s,loserID=%s" % (playerIDB, loserID), roomID) else: # ƽ·Ö 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 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) # ¾öÈü¿É»ñÈ¡×îÖÕÃû´Î 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 # ½áËã for playerID in [winnerID, loserID]: if not playerID: continue if playerID == winnerID: addItemList = wAwardItemList mailTypeKey = "CrossChampionshipPKWin%s" % groupMark tagPlayerID = loserID else: addItemList = fAwardItemList mailTypeKey = "CrossChampionshipPKLose%s" % groupMark tagPlayerID = winnerID rank = playerRankInfo.get(playerID, 0) GameWorld.Log(" ½áËã¿ç·þÅÅλÈüÍæ¼Ò½±Àø: zoneID=%s,groupMark=%s,battleNum=%s,rank=%s,tagPlayerID=%s,addItemList=%s" % (zoneID, groupMark, battleNum, rank, tagPlayerID, addItemList), playerID) if rank: paramList = [rank] else: paramList = [] playerIDList = [playerID] PlayerCompensation.SendMailByKey(mailTypeKey, playerIDList, addItemList, paramList, crossMail=True) # ͬ²½×Ó·þ Send_CrossServerMsg_ChampionshipGroup(battleObj=battleObj) # ¼Ç¼Á÷Ïò winnerInfo = winner.GetString() if winner else {} loserInfo = loser.GetString() if loser else {} dataDict = {"winner":winnerInfo, "loser":loserInfo, "battle":battleObj.GetString(), "playerRankInfo":playerRankInfo} DR_CrossChampionshipPK("PKRoomOver", dataDict) return True def ClientServerMsg_ChampionshipPKOver(serverGroupID, msgData): ## ÊÕµ½×Ó·þͬ²½µÄ¾µÏñPK½á¹û playerID = msgData["playerID"] tagPlayerID = msgData["tagPlayerID"] funcLineID = msgData["funcLineID"] isWin = msgData["isWin"] addScore = msgData["addScore"] baseScore = msgData["baseScore"] hpScore = msgData["hpScore"] timeScore = msgData["timeScore"] pkCountMax = msgData["pkCountMax"] zoneID = funcLineID / 100 groupMark = funcLineID % 100 groupMarkList = ShareDefine.CrossChampionshipEnterStateInfo.values() if groupMark not in groupMarkList: GameWorld.ErrLog("¿ç·þÅÅλ¾µÏñPK½á¹û·Ö×éÒì³£! groupMark=%s" % groupMark, playerID) return champMgr = GetChampionshipMgr() pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) if not pkZoneMgr: return battleObj = pkZoneMgr.GetBattleByPlayerID(groupMark, playerID) if not battleObj: GameWorld.ErrLog("¿ç·þÅÅλ¾µÏñPK½á¹ûÍæ¼Ò²»ÔÚ¸ÃÅÅλ·Ö×éÖÐ! zoneID=%s,groupMark=%s" % (zoneID, groupMark), playerID) return battleNum = battleObj.battleNum playerIDA = battleObj.playerIDA playerIDB = battleObj.playerIDB roomPlayerIDList = [playerIDA, playerIDB] # ÓÐÂÖ¿ÕµÄĬÈϲ»Óôò if playerID not in roomPlayerIDList or tagPlayerID not in roomPlayerIDList or not tagPlayerID or not playerIDA or not playerIDB: GameWorld.ErrLog("¿ç·þÅÅλ¾µÏñPK½á¹ûÍæ¼ÒID´íÎó! zoneID=%s,groupMark=%s,playerID=%s,tagPlayerID=%s,roomPlayerIDList=%s" % (zoneID, groupMark, playerID, tagPlayerID, roomPlayerIDList), playerID) return if playerID not in battleObj.playerBatDict: battleObj.playerBatDict[playerID] = [] batRetList = battleObj.playerBatDict[playerID] if len(batRetList) >= pkCountMax or not pkCountMax: GameWorld.ErrLog("¿ç·þÅÅλ¾µÏñPK½á¹ûÒÑ´ïPK´ÎÊýÉÏÏÞ! zoneID=%s,groupMark=%s,playerID=%s,tagPlayerID=%s,batRetList=%s" % (zoneID, groupMark, playerID, tagPlayerID, batRetList), playerID) return if battleObj.overTime: GameWorld.ErrLog("¿ç·þÅÅλ¾µÏñPKʤ¸ºÒѾ­½áËã¹ýÁË£¬²»ÔÙ¸üÐÂPK½á¹û! zoneID=%s,groupMark=%s,battleNum=%s,winPlayerID=%s,overTime=%s" % (zoneID, groupMark, battleNum, battleObj.winPlayerID, GameWorld.ChangeTimeNumToStr(battleObj.overTime)), playerID) return isWin = 1 if isWin else 0 batRetList.append([isWin, addScore, baseScore, hpScore, timeScore]) GameWorld.Log("¿ç·þÅÅλ¾µÏñPK½á¹û: zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s,playerIDB=%s,batCount=%s,isWin=%s,addScore=%s,baseScore=%s,hpScore=%s,timeScore=%s" % (zoneID, groupMark, battleNum, playerIDA, playerIDB, len(batRetList), isWin, addScore, baseScore, hpScore, timeScore), playerID) # ÊÇ·ñ¶¼´òÍêËùÓдÎÊý£¬Êǵϰֱ½Ó½áËãʤ¸º isAllOver = True for roomPlayerID in roomPlayerIDList: batList = battleObj.playerBatDict.get(roomPlayerID, []) if len(batList) < pkCountMax: isAllOver = False break if isAllOver: if DoBattleOverLogic(zoneID, groupMark, battleNum): return # ͬ²½×Ó·þ Send_CrossServerMsg_ChampionshipGroup(battleObj=battleObj) 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) syncNewWorshipList = [] syncNewXiangongDict = {} crossZoneName = GameWorld.GetCrossZoneName() for zoneID in pkZoneIDList: GameWorld.Log("=== ½áËãÅÅλ·ÖÇø: zoneID=%s ===" % zoneID, zoneID) zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID) serverIDRangeList = zoneIpyData.GetServerGroupIDList() if zoneIpyData else [] 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 [] xiangongID = rankIpyData.GetXiangongID() if rankIpyData else 0 GameWorld.Log(" ×îÖÕÅÅÃû: zoneID=%s,rank=%s,playerID=%s,officialID=%s,xiangongID=%s,rankAwardItemList=%s,accID=%s,fightPower=%s" % (zoneID, rank, playerID, officialID, xiangongID, rankAwardItemList, accID, fightPower), zoneID) if officialID: offObj = ChampionshipOfficial() offObj.zoneID = zoneID offObj.officialID = officialID offObj.rank = rank offObj.playerID = playerID offZoneMgr.officialInfo[officialID] = offObj # Ãû´Î½±Àø paramList = [rank] PlayerCompensation.SendMailByKey("CrossChampionshipPKRank", [playerID], rankAwardItemList, paramList, crossMail=True) GameXiangong.AddXiangongPlayer(xiangongID, playerID, serverIDRangeList, rank, syncNewXiangongDict) GameWorship.AddWorshipPlayer(worshipType, rank, playerID, serverIDRangeList, syncNewWorshipList) # ´¦Àí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.SendNewWorshipPlayer(syncNewWorshipList) GameXiangong.SendNewXiangongPlayerToClientServer(syncNewXiangongDict) 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 battleRetDict = {str(k):v for k, v in battleObj.playerBatDict.items()} battlePack = ChPyNetSendPack.tagGCCrossChampionshipPKBattle() battlePack.BattleNum = battleNum battlePack.WinPlayerID = battleObj.winPlayerID battlePack.PlayerIDA = battleObj.playerIDA battlePack.PlayerIDB = battleObj.playerIDB battlePack.BattleRet = json.dumps(battleRetDict, ensure_ascii=False).replace(" ", "") battlePack.BattleRetLen = len(battlePack.BattleRet) 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 playerPack.Face = batPlayer.face playerPack.FacePic = batPlayer.facePic 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 offPlayer.Face = offObj.face offPlayer.FacePic = offObj.facePic 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) applyPlayer.Face = playerInfo.get("Face", 0) applyPlayer.FacePic = playerInfo.get("FacePic", 0) 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