#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package CrossRealmPK # # @todo:¿ç·þPK¾º¼¼³¡ # @author hxp # @date 2018-12-21 # @version 1.0 # # ÏêϸÃèÊö: ¿ç·þPK¾º¼¼³¡ # #------------------------------------------------------------------------------- #"""Version = 2018-12-21 18:00""" #------------------------------------------------------------------------------- import GameWorld import PlayerControl import CrossRealmMsg import DataRecordPack import ChPyNetSendPack import PyGameDataStruct import PlayerDBGSEvent import CrossBillboard import PyDataManager import NetPackCommon import IpyGameDataPY import ShareDefine import PyGameData import CommFunc import ChConfig import datetime import operator import random import time #¿ç·þPKÅÅÐаñ¹ÜÀí£¬×¢Òâ¸ÃÀàÖ»´¦ÀíÊý¾ÝÂß¼­£¬¹¦ÄÜÏà¹ØÂß¼­²»ÒªÐ´ÔÚ¸ÃÀ࣬²»È»ÖضÁ½Å±¾²»»áÉúЧ class CrossPKBillboardManager(object): DBKEY_CrossPKFinalBillboardData = "CrossPKFinalBillboard_%s_%s" # ÊÇ·ñÊÕµ½ÈüÇøÈü¼¾×îÖÕ°ñµ¥Í¬²½£¬²ÎÊý£¨zoneID, seasonID£© def __init__(self): self.__ZoneSeasonDataList = "ZoneSeasonDataList_%s_%s" # ·ÖÇøÈü¼¾ÅÅÐÐÊý¾ÝÁбí [tagDBCrossPKBillboard, ...] self.__ZoneSeasonPlayerOrderDict = "ZoneSeasonPlayerOrderDict_%s_%s" # ·ÖÇøÈü¼¾ÅÅÐÐÊý¾Ý×Öµä {playerID:rank, ...} self.__ZoneSeasonList = [] # ·ÖÇøÈü¼¾Áбí [(zoneID, seasonID), ...] self.__UnSortZoneSeasonTimeDict = {} # δÅÅÐòµÄ·ÖÇøÈü¼¾ÅÅÐÐ {(zoneID, seasonID):tick, ...} return def GetCrossPKBillboardInfo(self, zoneID, seasonID, isSort=False): ## »ñÈ¡¿ç·þPKÅÅÐаñÐÅÏ¢ # @return: billboardList, orderDict listAttrName = self.__ZoneSeasonDataList % (zoneID, seasonID) orderDictAttrName = self.__ZoneSeasonPlayerOrderDict % (zoneID, seasonID) if not hasattr(self, listAttrName): setattr(self, listAttrName, []) setattr(self, orderDictAttrName, {}) self.__ZoneSeasonList.append((zoneID, seasonID)) billboardList = getattr(self, listAttrName) if isSort: self.__PKBillboardSort(zoneID, seasonID, billboardList) orderDict = getattr(self, orderDictAttrName) return billboardList, orderDict def __PKBillboardSort(self, zoneID, seasonID, billboardList): ## ÅÅÐò if (zoneID, seasonID) not in self.__UnSortZoneSeasonTimeDict: return self.__UnSortZoneSeasonTimeDict.pop((zoneID, seasonID)) billboardList.sort(key=operator.attrgetter("PKScore", "Time"), reverse=True) orderDict = {} for order, billboardData in enumerate(billboardList, 1): orderDict[billboardData.PlayerID] = order # »º´æÈü¼¾Íæ¼ÒÅÅÃû orderDictAttrName = self.__ZoneSeasonPlayerOrderDict % (zoneID, seasonID) setattr(self, orderDictAttrName, orderDict) GameWorld.DebugLog("¿ç·þPK°ñµ¥ÅÅÐò: zoneID=%s,seasonID=%s,orderDict=%s" % (zoneID, seasonID, orderDict)) return def PKBillboardSortByTime(self, tick): ## ¶¨Ê±ÅÅÐò if not self.__UnSortZoneSeasonTimeDict: return sortCD = 60 * 1000 # ³¬¹ý1·ÖÖÓÇ¿ÖÆÅÅÐò for key, updTick in self.__UnSortZoneSeasonTimeDict.items(): zoneID, seasonID = key if tick - updTick < sortCD: continue self.GetCrossPKBillboardInfo(zoneID, seasonID, True) return def SetNeedSort(self, zoneID, seasonID): if (zoneID, seasonID) not in self.__UnSortZoneSeasonTimeDict: self.__UnSortZoneSeasonTimeDict[(zoneID, seasonID)] = GameWorld.GetGameWorld().GetTick() return ## =========================================================================================== def CopyToCrossBillboard(self): toBillboardType = ShareDefine.Def_CBT_CrossRealmPK billboardMgr = PyDataManager.GetCrossBillboardManager() for zoneID, seasonID in self.__ZoneSeasonList: groupValue1, groupValue2 = zoneID, seasonID toBillboardObj = billboardMgr.GetCrossBillboard(toBillboardType, groupValue1, groupValue2) billboardList = self.GetCrossPKBillboardInfo(zoneID, seasonID)[0] GameWorld.Log("CopyToCrossBillboard: zoneID=%s,seasonID=%s,%s" % (zoneID, seasonID, len(billboardList))) for billboardData in billboardList: tobillboardData = PyGameDataStruct.tagDBCrossBillboard() tobillboardData.GroupValue1 = groupValue1 tobillboardData.GroupValue2 = groupValue2 tobillboardData.BillboardType = toBillboardType tobillboardData.ID = billboardData.PlayerID tobillboardData.Name1 = billboardData.PlayerName tobillboardData.Type2 = billboardData.Job tobillboardData.Value1 = billboardData.RealmLV tobillboardData.Value2 = billboardData.DanLV tobillboardData.Value3 = billboardData.Face tobillboardData.Value4 = billboardData.FacePic tobillboardData.CmpValue = billboardData.PKScore tobillboardData.CmpValue3 = billboardData.Time toBillboardObj.AddBillboardData(tobillboardData) self.__ZoneSeasonList = [] return # ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup def GetSaveData(self): savaData = "" cntData = "" cnt = 0 for zoneID, seasonID in self.__ZoneSeasonList: billboardList = self.GetCrossPKBillboardInfo(zoneID, seasonID)[0] for billboardData in billboardList: cnt += 1 savaData += billboardData.getBuffer() GameWorld.Log("SaveCrossPKBillboard cnt :%s len=%s" % (cnt, len(savaData))) return CommFunc.WriteDWORD(cntData, cnt) + savaData # ´ÓÊý¾Ý¿âÔØÈëÊý¾Ý def LoadPyGameData(self, datas, pos, dataslen): cnt, pos = CommFunc.ReadDWORD(datas, pos) GameWorld.Log("LoadCrossPKBillboard cnt :%s" % cnt) for _ in xrange(cnt): billboardData = PyGameDataStruct.tagDBCrossPKBillboard() billboardData.clear() pos += billboardData.readData(datas, pos, dataslen) zoneID = billboardData.ZoneID seasonID = billboardData.SeasonID billboardList = self.GetCrossPKBillboardInfo(zoneID, seasonID)[0] billboardList.append(billboardData) # ÅÅÐò for zoneID, seasonID in self.__ZoneSeasonList: self.SetNeedSort(zoneID, seasonID) billboardList = self.GetCrossPKBillboardInfo(zoneID, seasonID, True)[0] GameWorld.Log(" zoneID=%s, seasonID=%s, count=%s" % (zoneID, seasonID, len(billboardList))) self.CopyToCrossBillboard() return pos def MapServer_QueryCrossPKSeasonOrder(curPlayer, msgList): ## µØÍ¼·þÎñÆ÷²éÑ¯Íæ¼ÒÈüÇøÈü¼¾PK°ñÅÅÃû playerID = curPlayer.GetPlayerID() zoneID, seasonID, eventName, eventData = msgList funcData = {"zoneID":zoneID, "seasonID":seasonID, "eventName":eventName, "eventData":eventData} CrossBillboard.OnQueryPlayerBillboardRank(playerID, "QueryCrossPKSeasonOrder", funcData, ShareDefine.Def_CBT_CrossRealmPK, zoneID, seasonID) return def OnQueryCrossPKSeasonOrderRet(playerID, funcData, orderIndex): ## ²éѯÅÅÃû·µ»Ø queryPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if not queryPlayer: return zoneID = funcData["zoneID"] seasonID = funcData["seasonID"] eventName = funcData["eventName"] eventData = funcData["eventData"] order = orderIndex + 1 sysMsg = str([zoneID, seasonID, eventName, eventData, order]) queryPlayer.MapServer_QueryPlayerResult(0, 0, "CrossPKSeasonOrder", sysMsg, len(sysMsg)) return ################################################################################ def __GetCrossPKZoneSeasonTimeInfo(): key = "CrossPKZoneSeasonTimeInfo" openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 ZoneSeasonTimeInfo = IpyGameDataPY.GetConfigEx(key) if ZoneSeasonTimeInfo and ZoneSeasonTimeInfo[0] == openServerDay: #GameWorld.DebugLog("ÒѾ­¼ÓÔØ¹ý±¾ÈÕ¿ç·þPKÈü¼¾´¦ÀíÐÅÏ¢£¡openServerDay=%s" % openServerDay) return ZoneSeasonTimeInfo[1] GameWorld.Log("¼ÓÔØ¿ç·þPKÈü¼¾Ê±¼äÐÅÏ¢: openServerDay=%s" % (openServerDay)) zoneSeasonTimeDict = {} serverTime = GameWorld.GetServerTime() crossZoneName = GameWorld.GetCrossZoneName() crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True) if not crossZoneList: return zoneSeasonTimeDict for zoneIpyData in crossZoneList: zoneID = zoneIpyData.GetZoneID() # ¹æ¶¨Ã¿¸öÈüÇøµÄÈü¼¾Ê±¼äÐ谴˳ÐòÅäÖà seasonIpyDataList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", crossZoneName, zoneID) if not seasonIpyDataList: continue for i, seasonIpyData in enumerate(seasonIpyDataList): seasonID = seasonIpyData.GetSeasonID() startDateStr = seasonIpyData.GetStartDate() endDateStr = seasonIpyData.GetEndDate() endTimeStr = seasonIpyData.GetEndTime() startDateTime = datetime.datetime.strptime("%s 00:00:00" % (startDateStr), ChConfig.TYPE_Time_Format) endDateTime = datetime.datetime.strptime("%s %s:00" % (endDateStr, endTimeStr), ChConfig.TYPE_Time_Format) # ×îºóÒ»¸öÈü¼¾ if i == len(seasonIpyDataList) - 1: nextSeasonIpyData = None else: nextSeasonIpyData = seasonIpyDataList[i + 1] if serverTime < startDateTime: GameWorld.Log(" Èü¼¾Î´¿ªÊ¼! zoneID=%s,seasonID=%s,startDateStr=%s,endDateStr=%s" % (zoneID, seasonID, startDateStr, endDateStr)) break elif startDateTime <= serverTime <= endDateTime: pass elif endDateTime < serverTime: if nextSeasonIpyData: nestStartDateStr = nextSeasonIpyData.GetStartDate() nextStartDateTime = datetime.datetime.strptime("%s 00:00:00" % (nestStartDateStr), ChConfig.TYPE_Time_Format) if serverTime >= nextStartDateTime: GameWorld.Log(" Èü¼¾ÒѹýÆÚ! zoneID=%s,seasonID=%s,startDateStr=%s,endDateStr=%s" % (zoneID, seasonID, startDateStr, endDateStr)) continue else: pass else: continue nextSeasonID = 0 if not nextSeasonIpyData else nextSeasonIpyData.GetSeasonID() zoneSeasonTimeDict[zoneID] = [seasonIpyData] GameWorld.Log(" Èü¼¾»î¶¯ÖÐ! zoneID=%s,seasonID=%s,startDateStr=%s,endDateStr=%s,nextSeasonID=%s" % (zoneID, seasonID, startDateStr, endDateStr, nextSeasonID)) break ZoneSeasonTimeInfo = IpyGameDataPY.SetConfigEx(key, [openServerDay, zoneSeasonTimeDict]) GameWorld.Log("¿ç·þPKÈü¼¾Ê±¼äÐÅÏ¢¼ÓÔØÍê±Ï!") GameWorld.Log("=============================================================") return ZoneSeasonTimeInfo[1] def OnMinuteProcess(): ## ÿ·ÖÖÓ´¦Àí if not GameWorld.IsCrossServer(): return zoneSeasonTimeDict = __GetCrossPKZoneSeasonTimeInfo() if not zoneSeasonTimeDict: return gameWorld = GameWorld.GetGameWorld() serverTime = GameWorld.GetServerTime() crossZoneName = GameWorld.GetCrossZoneName() for zoneID, seasonTimeInfo in zoneSeasonTimeDict.items(): zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID) if not zoneIpyData: continue curSeasonIpyData = seasonTimeInfo[0] if not curSeasonIpyData: continue seasonID = curSeasonIpyData.GetSeasonID() startDateStr = curSeasonIpyData.GetStartDate() endDateStr = curSeasonIpyData.GetEndDate() endTimeStr = curSeasonIpyData.GetEndTime() startDateTime = datetime.datetime.strptime("%s 00:00:00" % (startDateStr), ChConfig.TYPE_Time_Format) endDateTime = datetime.datetime.strptime("%s %s:00" % (endDateStr, endTimeStr), ChConfig.TYPE_Time_Format) seasonState = 0 if startDateTime <= serverTime < endDateTime: seasonState = 1 elif serverTime >= endDateTime: seasonState = 2 zoneSeasonIDDictName = ChConfig.Def_WorldKey_CrossPKZoneSeasonID % zoneID seasonStateDictName = ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID dictSeasonID = gameWorld.GetDictByKey(zoneSeasonIDDictName) curSeasonState = gameWorld.GetDictByKey(seasonStateDictName) if curSeasonState == seasonState and dictSeasonID == seasonID: #ÒѾ­ÊÇÕâ¸ö״̬ÁË continue gameWorld.SetDict(zoneSeasonIDDictName, seasonID) gameWorld.SetDict(seasonStateDictName, seasonState) GameWorld.Log("¿ç·þPKÈü¼¾×´Ì¬±ä¸ü: zoneID=%s,seasonID=%s,seasonState=%s" % (zoneID, seasonID, seasonState)) serverGroupIDList = zoneIpyData.GetServerGroupIDList() # Èü¼¾½áÊø if seasonState == 2: PyGameData.g_crossPKMatchDict = {} # ¹ã²¥µ±Ç°ÈüÇøµÄËùÓÐ×Ó·þ¿ç·þPKÈü¼¾×´Ì¬±ä¸ü matchState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK) seasonInfo = {"ZoneID":zoneID, "SeasonID":seasonID, "SeasonState":seasonState, "MatchState":matchState} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKSeasonInfo, seasonInfo, serverGroupIDList) return def OnCrossRealmPKDailyActionStateChange(isOpen): ## ¿ç·þPKÿÈջƥÅä״̬±ä¸ü if not GameWorld.IsCrossServer(): return gameWorld = GameWorld.GetGameWorld() preState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK) gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK, isOpen) # Æ¥Åä״̬´Ó¹Ø±Õµ½¿ªÆô if not preState and isOpen: GameWorld.Log("¿ç·þPKÆ¥Åä״̬¿ªÆô£¬ÖØÖÃÏà¹ØÆ¥ÅäÊý¾Ý!") crossZoneName = GameWorld.GetCrossZoneName() crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True) if not crossZoneList: return for zoneIpyData in crossZoneList: zoneID = zoneIpyData.GetZoneID() # ¹ã²¥µ±Ç°ÈüÇøµÄËùÓÐ×Ó·þ¿ç·þPKÈü¼¾×´Ì¬±ä¸ü serverGroupIDList = zoneIpyData.GetServerGroupIDList() seasonID = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonID % zoneID) seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID) seasonInfo = {"ZoneID":zoneID, "SeasonID":seasonID, "SeasonState":seasonState, "MatchState":isOpen} GameWorld.Log("¿ç·þPKÆ¥Åä״̬±ä¸ü: zoneID=%s,seasonID=%s,seasonState=%s,matchState=%s" % (zoneID, seasonID, seasonState, isOpen)) CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKSeasonInfo, seasonInfo, serverGroupIDList) return def Sync_CrossPKInitDataToClientServer(tick, serverGroupID=0): ''' ͬ²½¿ç·þPK»î¶¯Êý¾Ýµ½×Ó·þÎñÆ÷ @param serverGroupID: Ϊ0ʱͬ²½ËùÓÐ×Ó·þ ''' GameWorld.Log("ͬ²½¸ø×Ó·þ¶ÔÓ¦µÄÈü¼¾ÐÅÏ¢: syncServerGroupID=%s" % (serverGroupID)) if serverGroupID: ipyData = GetCrossPKServerGroupZone(serverGroupID) if not ipyData: return crossZoneList = [ipyData] else: crossZoneName = GameWorld.GetCrossZoneName() crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True) if not crossZoneList: return gameWorld = GameWorld.GetGameWorld() for zoneIpyData in crossZoneList: zoneID = zoneIpyData.GetZoneID() seasonID = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonID % zoneID) seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID) matchState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK) seasonInfo = {"ZoneID":zoneID, "SeasonID":seasonID, "SeasonState":seasonState, "MatchState":matchState} serverGroupIDList = [serverGroupID] if serverGroupID else zoneIpyData.GetServerGroupIDList() CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKSeasonInfo, seasonInfo, serverGroupIDList) return def GetCrossPKServerGroupZone(serverGroupID): ## »ñÈ¡·þÎñÆ÷×éID¶ÔÓ¦µÄ¿ç·þPKËùÊôÈüÇø£¬·µ»Ø0´ú±í¸Ã·þÎñÆ÷ûÓзÖÅäÈüÇø crossZoneName = GameWorld.GetCrossZoneName() crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True) if not crossZoneList: return for zoneIpyData in crossZoneList: for groupInfo in zoneIpyData.GetServerGroupIDList(): if (isinstance(groupInfo, int) and serverGroupID == groupInfo) \ or (isinstance(groupInfo, tuple) and len(groupInfo) == 2 and groupInfo[0] <= serverGroupID <= groupInfo[1]): return zoneIpyData return def OnPlayerLogin(curPlayer): # ±¾·þµÇ¼´¦Àí # ±¾·þûÓзÖÅäÈüÇø²»´¦Àí if not GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID): return __OnLoginNotifyPKOverInfo(curPlayer) crossZoneName = GameWorld.GetCrossZoneName() crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True) if not crossZoneList: return # ͬ²½ËùÓÐÈüÇøÈü¼¾ÐÅÏ¢ zoneSeasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeasonInfo() zoneSeasonInfo.ZoneList = [] for zoneIpyData in crossZoneList: zoneID = zoneIpyData.GetZoneID() zoneInfo = ChPyNetSendPack.tagGCCrossRealmPKZone() zoneInfo.ZoneID = zoneID zoneInfo.ZoneName = zoneIpyData.GetZoneName().decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding()) zoneInfo.ZoneNameLen = len(zoneInfo.ZoneName) zoneInfo.SeasonList = [] seasonList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", crossZoneName, zoneID) seasonList = [] if not seasonList else seasonList for seasonIpyData in seasonList: seasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeason() seasonInfo.SeasonID = seasonIpyData.GetSeasonID() seasonInfo.StartDate = seasonIpyData.GetStartDate() seasonInfo.EndDate = seasonIpyData.GetEndDate() seasonInfo.EndTime = seasonIpyData.GetEndTime() zoneInfo.SeasonList.append(seasonInfo) zoneInfo.SeasonCount = len(zoneInfo.SeasonList) zoneSeasonInfo.ZoneList.append(zoneInfo) zoneSeasonInfo.ZoneCount = len(zoneSeasonInfo.ZoneList) NetPackCommon.SendFakePack(curPlayer, zoneSeasonInfo) # ͬ²½±¾·þÈü¼¾×´Ì¬ gameWorld = GameWorld.GetGameWorld() seasonStatePack = ChPyNetSendPack.tagGCCrossRealmPKSeasonState() seasonStatePack.ZoneID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID) seasonStatePack.SeasonID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID) seasonStatePack.SeasonState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState) seasonStatePack.MatchState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK) seasonStatePack.CrossZoneName = GameWorld.GetCrossZoneName() seasonStatePack.CrossZoneNameLen = len(seasonStatePack.CrossZoneName) NetPackCommon.SendFakePack(curPlayer, seasonStatePack) return def IsCrossRealmPKMatchState(): ## ¿ç·þPKÆ¥ÅäÈüÊÇ·ñ¿ªÆô return GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState \ % ShareDefine.DailyActionID_CrossReamPK) == ChConfig.Def_Action_Open def ClientServerMsg_PKMatch(serverGroupID, playerInfoDict, tick): ## ÇëÇóÆ¥Åä seasonID = playerInfoDict["seasonID"] # Èü¼¾ID zoneID = playerInfoDict["zoneID"] # ËùÊôÈüÇø playerID = playerInfoDict["playerID"] # ½ÇÉ«ID fightPower = playerInfoDict["fightPower"] requestType = playerInfoDict.get("requestType", 0) isRefresh = requestType == 1 OnRefreshPKMatch(zoneID, seasonID, playerID, fightPower, serverGroupID, isRefresh) return def ClientServerMsg_PKOver(serverGroupID, playerInfoDict, tick): ## ÊÕµ½×Ó·þͬ²½µÄPK½áËã playerID = playerInfoDict["playerID"] # ½ÇÉ«ID tagPlayerID = playerInfoDict["tagPlayerID"] # Ä¿±êÍæ¼ÒID isWinner = playerInfoDict["isWinner"] # ÊÇ·ñ»ñʤ zoneID = playerInfoDict["pkZoneID"] seasonID = playerInfoDict["seasonID"] playerName = playerInfoDict["playerName"] playerJob = playerInfoDict["playerJob"] face = playerInfoDict["face"] facePic = playerInfoDict["facePic"] realmLV = playerInfoDict["realmLV"] fightPower = playerInfoDict["fightPower"] pkScore = playerInfoDict["pkScore"] danLV = playerInfoDict["danLV"] cWinCount = playerInfoDict["cWinCount"] if playerID not in PyGameData.g_crossPKMatchDict: GameWorld.ErrLog("Íæ¼ÒÆ¥Å䣬ÎÞ·¨½áËã¿ç·þPK½±Àø! tagPlayerID=%s,isWinner=%s,pkScore=%s,cWinCount=%s" % (tagPlayerID, isWinner, pkScore, cWinCount), playerID) return matchIDList = PyGameData.g_crossPKMatchDict[playerID] if tagPlayerID not in matchIDList: GameWorld.ErrLog("Ä¿±êÍæ¼ÒID²»ÔÚÍæ¼ÒÆ¥ÅäÁбíÀÎÞ·¨½áËã¿ç·þPK½±Àø! tagPlayerID=%s not in %s ,isWinner=%s,pkScore=%s,cWinCount=%s" % (tagPlayerID, matchIDList, isWinner, pkScore, cWinCount), playerID) return matchIndex = matchIDList.index(tagPlayerID) addScore = IpyGameDataPY.GetFuncCfg("CrossRealmPKScore2", 2) # ĬÈÏʧ°Ü»ý·Ö if isWinner: baseScoreList = IpyGameDataPY.GetFuncEvalCfg("CrossRealmPKScore2", 1) baseScore = baseScoreList[matchIndex] if len(baseScoreList) > matchIndex else 0 wExScore = eval(IpyGameDataPY.GetFuncCompileCfg("CrossRealmPKScore2", 3)) # ʤ·½¸½¼Ó·Ö addScore = baseScore + wExScore cWinCount += 1 else: cWinCount = 0 updScore = pkScore + addScore pkDanIpyData = IpyGameDataPY.GetIpyGameData("CrossRealmPKDan", danLV) if pkDanIpyData and pkDanIpyData.GetLVUpScore() and updScore >= pkDanIpyData.GetLVUpScore(): danLV += 1 GameWorld.Log("½áËã¿ç·þPK½±Àø: tagPlayerID=%s,isWinner=%s,pkScore=%s,cWinCount=%s,addScore=%s,updScore=%s,danLV=%s" % (tagPlayerID, isWinner, pkScore, cWinCount, addScore, updScore, danLV), playerID) # ¸üаñµ¥ groupValue1, groupValue2 = zoneID, seasonID name2, type2 = "", playerJob value1, value2 = realmLV, danLV cmpValue = updScore CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_CrossRealmPK, groupValue1, playerID, playerName, name2, type2, value1, value2, cmpValue, groupValue2=groupValue2, value3=face, value4=facePic) # ֪ͨ×Ó·þ pkScore = updScore packDataMgr = PyDataManager.GetDBPlayerPackDataManager() tagPackObj = packDataMgr.GetPlayerPackObj(tagPlayerID) tagPlayerName = tagPackObj.playerName if tagPackObj else "" winnerID = playerID if isWinner else tagPlayerID timeStr = GameWorld.GetCurrentDataTimeStr() playerOverDict = {} playerOverDict[playerID] = [zoneID, seasonID, timeStr, winnerID, pkScore, danLV, cWinCount, addScore, tagPlayerID, tagPlayerName] serverGroupIDList = [serverGroupID] CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKOverInfo, playerOverDict, serverGroupIDList) # ÏµÍ³ÖØÐÂË¢ÐÂÆ¥Åä OnRefreshPKMatch(zoneID, seasonID, playerID, fightPower, serverGroupID, True) return def OnRefreshPKMatch(zoneID, seasonID, playerID, fightPower, serverGroupID, isRefresh): # Ë¢ÐÂÆ¥ÅäÊý¾Ý # @param isRefresh: ÊÇ·ñÇ¿ÖÆÖØÐÂˢРif isRefresh or playerID not in PyGameData.g_crossPKMatchDict: # Ö´ÐÐÆ¥ÅäÂß¼­ matchIDList = __DoPKMatch(zoneID, seasonID, playerID, fightPower) if matchIDList: # ÓÐнá¹û²ÅÌæ»» PyGameData.g_crossPKMatchDict[playerID] = matchIDList packDataMgr = PyDataManager.GetDBPlayerPackDataManager() matchIDList = PyGameData.g_crossPKMatchDict.get(playerID, []) matchInfoDict = {} for matchID in matchIDList: packObj = packDataMgr.GetPlayerPackObj(matchID) if not packObj: continue matchInfoDict[matchID] = packObj.GetBaseDict() dataMsg = {"playerID":playerID, "matchIDList":matchIDList, "matchInfoDict":matchInfoDict} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKMatchReqRet, dataMsg, [serverGroupID]) return def __DoPKMatch(zoneID, seasonID, playerID, fightPower): ## Ö´ÐÐÆ¥Åä if not IsCrossRealmPKMatchState(): GameWorld.DebugLog("·ÇÆ¥Åä½×¶Î£¬²»ÔÊÐíË¢ÐÂÆ¥Åä! zoneID=%s,seasonID=%s" % (zoneID, seasonID), playerID) return matchCount = IpyGameDataPY.GetFuncCfg("CrossRealmPKMatch3", 1) rankRange = IpyGameDataPY.GetFuncCfg("CrossRealmPKMatch3", 2) # Ãû´Î·¶Î§¶Î totalRange = rankRange * matchCount # ×ÜÆ¥ÅäÃû´Î·¶Î§ matchIDList = [] # Æ¥ÅäID½á¹ûÁбí billboardType = ShareDefine.Def_CBT_CrossRealmPK groupValue1, groupValue2 = zoneID, seasonID billboardMgr = PyDataManager.GetCrossBillboardManager() billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2) billDataCount = billboardObj.GetCount() playerBillIndex = billboardObj.IndexOfByID(playerID) GameWorld.DebugLog("===Ö´ÐÐÆ¥Åä: zoneID=%s,seasonID=%s,playerID=%s,fightPower=%s,playerBillIndex=%s,matchCount=%s" % (zoneID, seasonID, playerID, fightPower, playerBillIndex, matchCount), playerID) if playerBillIndex <= 0: playerBillIndex = billDataCount GameWorld.DebugLog("Íæ¼ÒδÉÏ»ý·Ö°ñ£¬ÊÓΪÅÅÔÚ°ñÉÏ×îºóÒ»ÃûÖ®ºó! playerBillIndex=%s" % playerBillIndex, playerID) billStartIndex = max(0, playerBillIndex - totalRange / 2) # ÒÔ×Ô¼ºµÄÅÅÃûΪÖÐÐÄË÷Òý billLoopIndexList = range(billStartIndex, billStartIndex + totalRange + 1) if playerBillIndex in billLoopIndexList: billLoopIndexList.remove(playerBillIndex) # ÒÆ³ý×Ô¼º loopBillPlayerIDList = [] for index in billLoopIndexList: if index >= billDataCount: break billData = billboardObj.At(index) loopBillPlayerIDList.append(int(billData.ID)) GameWorld.DebugLog("»ý·Ö°ñ¿ÉÆ¥ÅäµÄÅÅÃûÍæ¼ÒIDÁбí: %s,%s" % (len(loopBillPlayerIDList), loopBillPlayerIDList), playerID) randPackPlayerIDList = None # ¿ÉËæ»úÆ¥ÅäµÄ´ò°üÊý¾ÝÕ½Á¦ÅÅÃûÍæ¼ÒIDÁбí for matchIndex in range(matchCount): GameWorld.DebugLog("Æ¥ÅäµÚ%s¸ö: matchIndex=%s,playerBillIndex=%s,billLoopIndexList=%s" % (matchIndex + 1, matchIndex, playerBillIndex, billLoopIndexList), playerID) matchID = 0 randIDList = [] # 1. ÓÅÏÈÈü¼¾»ý·ÖÅÅÐаñ if billDataCount: __addRandMatchID(playerID, matchIndex, rankRange, randIDList, matchIDList, loopBillPlayerIDList, 1) # ÓÐÐèÒªÓõ½Õ½Á¦Æ¥ÅäµÄ£¬¼ÓÔØÒ»´Î if not randIDList and randPackPlayerIDList == None: zonePackPlayerIDList = __getZonePackPlayerIDList(zoneID, playerID) playerPackIndex = -1 randPackPlayerIDList = [] if playerID in zonePackPlayerIDList: playerPackIndex = zonePackPlayerIDList.index(playerID) startIndex = max(0, playerPackIndex - totalRange / 2) # ÒÔ×Ô¼ºµÄÅÅÃûΪÖÐÐÄË÷Òý randPackPlayerIDList = [int(packID) for packID in zonePackPlayerIDList[startIndex:totalRange + 1]] # ÒòΪ°üº¬×Ô¼º£¬ËùÒÔ¼Ó1 if playerID in randPackPlayerIDList: randPackPlayerIDList.remove(playerID) # ÒÆ³ý×Ô¼º GameWorld.DebugLog(" ÈüÇøÕ½Á¦°ñÍæ¼ÒÅÅÃû: playerPackIndex=%s,%s,%s" % (playerPackIndex, len(zonePackPlayerIDList), zonePackPlayerIDList), playerID) GameWorld.DebugLog(" ÈüÇøÕ½Á¦°ñËæ»úÍæ¼Ò: %s,%s" % (len(randPackPlayerIDList), randPackPlayerIDList), playerID) # 2. ¸Ã·¶Î§¶ÎûÓеĻ°Æ¥Åä´ò°üÊý¾ÝÕ½Á¦°ñ if not randIDList and randPackPlayerIDList: __addRandMatchID(playerID, matchIndex, rankRange, randIDList, matchIDList, randPackPlayerIDList, 2) if randIDList: matchID = random.choice(randIDList) # 3. ×îÖÕ»¹Ã»ÓУ¬Ö±½Ó»úÆ÷ÈË if not matchID: matchID = matchIndex + 1 # »úÆ÷ÈËID¹Ì¶¨Îª matchIndex + 1 matchIDList.append(matchID) GameWorld.DebugLog(" ±¾¶ÎËæ»úÆ¥Åä½á¹û: matchIndex=%s,matchID=%s,randIDList=%s,matchIDList=%s" % (matchIndex, matchID, randIDList, matchIDList), playerID) GameWorld.DebugLog("×îÖÕÆ¥Åä½á¹û: matchIDList=%s" % str(matchIDList), playerID) return matchIDList def __addRandMatchID(playerID, matchIndex, rankRange, randIDList, matchIDList, loopPlayerIDList, sign): ## ¸ù¾ÝËùÓпÉÑ­»·Íæ¼ÒIDÁÐ±í£¬Ìí¼Ó¶ÔӦƥÅäÂִοÉËæ»úÆ¥ÅäµÄÍæ¼Ò packDataMgr = PyDataManager.GetDBPlayerPackDataManager() indexStart = matchIndex * rankRange indexEnd = indexStart + rankRange - 1 loopIDCount = len(loopPlayerIDList) if sign == 1: GameWorld.DebugLog(" Æ¥ÅäÈüÇø»ý·Ö°ñ: matchIndex=%s,loopIndex=%s~%s,loopIDCount=%s" % (matchIndex, indexStart, indexEnd, loopIDCount), playerID) else: GameWorld.DebugLog(" Æ¥ÅäÈüÇøÕ½Á¦°ñ: matchIndex=%s,loopIndex=%s~%s,loopIDCount=%s" % (matchIndex, indexStart, indexEnd, loopIDCount), playerID) for index in range(indexStart, indexEnd + 1): if index >= loopIDCount: break dataID = loopPlayerIDList[index] if not dataID or dataID == playerID or dataID in randIDList: GameWorld.DebugLog(" ²»¿ÉÆ¥Åä¿Õ»ò×Ô¼º»òÒÑÌí¼Ó: dataID=%s,randIDList=%s" % (dataID, randIDList), playerID) continue if dataID in matchIDList: GameWorld.DebugLog(" ²»¿ÉÌí¼ÓÒÑÆ¥Åä¹ýÍæ¼Ò: dataID=%s,randIDList=%s,matchIDList=%s" % (dataID, randIDList, matchIDList), playerID) continue if not packDataMgr.IsPlayerIn(dataID): GameWorld.DebugLog(" ²»Æ¥ÅäÎÞ´ò°üÊý¾ÝÍæ¼Ò: dataID=%s,randIDList=%s" % (dataID, randIDList), playerID) continue randIDList.append(dataID) GameWorld.DebugLog(" Ìí¼Ó¿ÉÒÔËæ»úÆ¥ÅäÍæ¼Ò: dataID=%s,randIDList=%s" % (dataID, randIDList), playerID) return def __getZonePackPlayerIDList(zoneID, playerID): ## »ñÈ¡·ÖÇø´ò°üÊý¾ÝÍæ¼ÒIDÁбí crossZoneName = GameWorld.GetCrossZoneName() zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID) if zoneIpyData: packDataMgr = PyDataManager.GetDBPlayerPackDataManager() packDataMgr.Sort() serverIDList = zoneIpyData.GetServerGroupIDList() zonePackPlayerIDList = packDataMgr.GetPlayerIDListByServerIDInfo(zoneIpyData.GetServerGroupIDList()) GameWorld.DebugLog(" »ñµÃÈüÇø»îÔ¾´ò°üÊý¾ÝÍæ¼Ò: zoneID=%s,serverIDList=%s,%s,%s" % (zoneID, serverIDList, len(zonePackPlayerIDList), zonePackPlayerIDList), playerID) return zonePackPlayerIDList return [] def ClientServerMsg_PKBillboard(serverGroupID, msgData): ## ÊÕµ½×Ó·þGMͬ²½µÄÉèÖÿç·þPKÊý¾Ý zoneID = msgData["ZoneID"] seasonID = msgData["SeasonID"] playerInfoDict = msgData["PlayerInfo"] accID = playerInfoDict["accID"] playerID = playerInfoDict["playerID"] playerName = playerInfoDict["playerName"] playerJob = playerInfoDict["playerJob"] face = playerInfoDict.get("face", 0) facePic = playerInfoDict.get("facePic", 0) realmLV = playerInfoDict["realmLV"] pkScore = playerInfoDict["pkScore"] danLV = playerInfoDict["danLV"] cWinCount = playerInfoDict["cWinCount"] # ¸üÐÂÅÅÐаñ groupValue1, groupValue2 = zoneID, seasonID name2, type2 = "", playerJob value1, value2 = realmLV, danLV cmpValue = pkScore isOK = CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_CrossRealmPK, groupValue1, playerID, playerName, name2, type2, value1, value2, cmpValue, groupValue2=groupValue2, value3=face, value4=facePic) GameWorld.Log("GMÉèÖÿç·þPK°ñµ¥Íæ¼ÒÊý¾Ý: isOK=%s,zoneID=%s,seasonID=%s,pkScore=%s,danLV=%s,cWinCount=%s,accID=%s" % (isOK, zoneID, seasonID, pkScore, danLV, cWinCount, accID), playerID) return ##================================== ÒÔÏÂÊÇ×Ó·þÂß¼­ ========================================== def OnGameServerInitOK(): if GameWorld.IsCrossServer(): return dbZoneID = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID) dbSeasonID = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID) dbSeasonState = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState) GameWorld.Log("OnGameServerInitOK dbZoneID=%s,dbSeasonID=%s,dbSeasonState=%s" % (dbZoneID, dbSeasonID, dbSeasonState)) gameWorld = GameWorld.GetGameWorld() zoneID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID) if not zoneID: gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID, dbZoneID) gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID, dbSeasonID) gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState, dbSeasonState) GameWorld.Log(" ·þÎñÆ÷Æô¶¯È¡DBÖµÉèÖñ¾·þÈüÇøÈü¼¾ÐÅÏ¢: ") return def OnMapServerInitOK(): # ֪ͨµØÍ¼·þÎñÆ÷״̬ if GameWorld.IsCrossServer(): return gameWorld = GameWorld.GetGameWorld() zoneID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID) seasonID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID) seasonState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState) matchState = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK) GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID, zoneID) GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID, seasonID) GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState, seasonState) GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK, matchState) return def CrossServerMsg_PKSeasonInfo(seasonInfo): ## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄÈü¼¾ÐÅÏ¢ #seasonInfo = {"ZoneID":zoneID, "SeasonID":seasonID, "SeasonState":seasonState, "MatchState":matchState} GameWorld.Log("ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄÈü¼¾ÐÅÏ¢...") if not seasonInfo: return zoneID = seasonInfo.get("ZoneID", 0) seasonID = seasonInfo.get("SeasonID", 0) seasonState = seasonInfo.get("SeasonState", 0) matchState = seasonInfo.get("MatchState", 0) GameWorld.Log(" zoneID=%s,seasonID=%s,seasonState=%s,matchState=%s" % (zoneID, seasonID, seasonState, matchState)) if not zoneID: return if not seasonID: dbSeasonID = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID) if dbSeasonID: GameWorld.ErrLog(" ÒѾ­ÓзÖÅäÈü¼¾IDµÄÔݶ¨²»Äܱ»ÖÃΪ0! dbSeasonID=%s" % dbSeasonID) return gameWorld = GameWorld.GetGameWorld() curSeasonState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState) gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID, zoneID) gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID, seasonID) gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState, seasonState) gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK, matchState) # Ç¿ÖÆ¸²¸Ç´æDB dbZoneID = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID) dbSeasonID = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID) dbSeasonState = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState) GameWorld.Log(" before dbZoneID=%s,dbSeasonID=%s,dbSeasonState=%s" % (dbZoneID, dbSeasonID, dbSeasonState)) PlayerDBGSEvent.SetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID, zoneID) PlayerDBGSEvent.SetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID, seasonID) PlayerDBGSEvent.SetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState, seasonState) dbZoneID = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID) dbSeasonID = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID) dbSeasonState = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState) GameWorld.Log(" update dbZoneID=%s,dbSeasonID=%s,dbSeasonState=%s" % (dbZoneID, dbSeasonID, dbSeasonState)) if curSeasonState == 1 and seasonState == 2: pass #PlayerControl.WorldNotify(0, "NotifySeasonOver") # ֪ͨµØÍ¼·þÎñÆ÷״̬ GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID, zoneID) GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID, seasonID) GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState, seasonState) GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK, matchState) # ¹ã²¥Íæ¼ÒÈü¼¾Ïà¹Ø×´Ì¬±ä¸ü seasonStatePack = ChPyNetSendPack.tagGCCrossRealmPKSeasonState() seasonStatePack.ZoneID = zoneID seasonStatePack.SeasonID = seasonID seasonStatePack.SeasonState = seasonState seasonStatePack.MatchState = matchState seasonStatePack.CrossZoneName = GameWorld.GetCrossZoneName() seasonStatePack.CrossZoneNameLen = len(seasonStatePack.CrossZoneName) playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(i) if curPlayer == None or not curPlayer.GetInitOK(): continue NetPackCommon.SendFakePack(curPlayer, seasonStatePack) return def CrossServerMsg_PKMatchReqRet(retInfo): ## ¿ç·þPKÆ¥ÅäÇëÇó½á¹û playerID = retInfo["playerID"] matchIDList = retInfo["matchIDList"] matchInfoDict = retInfo["matchInfoDict"] curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if not curPlayer: return matchOKPack = ChPyNetSendPack.tagGCCrossRealmPKMatchOK() matchOKPack.MatchPlayer = [] for matchID in matchIDList: matchPlayer = ChPyNetSendPack.tagGCCrossRealmPKMatchPlayer() if matchID not in matchInfoDict: matchPlayer.PlayerID = matchID matchOKPack.MatchPlayer.append(matchPlayer) continue matchInfo = matchInfoDict[matchID] matchPlayer.PlayerID = matchInfo["playerID"] matchPlayer.PlayerName = matchInfo["playerName"] matchPlayer.NameLen = len(matchPlayer.PlayerName) matchPlayer.Job = matchInfo["job"] matchPlayer.LV = matchInfo["lv"] matchPlayer.RealmLV = matchInfo["realmLV"] matchPlayer.Face = matchInfo["face"] matchPlayer.FacePic = matchInfo["facePic"] matchPlayer.FightPower = matchInfo["fightPower"] % ChConfig.Def_PerPointValue matchPlayer.FightPowerEx = matchInfo["fightPower"] / ChConfig.Def_PerPointValue matchOKPack.MatchPlayer.append(matchPlayer) matchOKPack.MatchPlayerCount = len(matchOKPack.MatchPlayer) NetPackCommon.SendFakePack(curPlayer, matchOKPack) return #¿ç·þ¾º¼¼³¡Î´Í¨ÖªÍæ¼ÒµÄ±ÈÈü½á¹û£¬×¢Òâ¸ÃÀàÖ»´¦ÀíÊý¾ÝÂß¼­£¬¹¦ÄÜÏà¹ØÂß¼­²»ÒªÐ´ÔÚ¸ÃÀ࣬²»È»ÖضÁ½Å±¾²»»áÉúЧ class CrossPKUnNotifyOverInfoManager(object): def __init__(self): self.__unNotifyOverInfoDict = {} # {playerID:tagDBCrossPKUnNotifyOverInfo, ...} return def AddUnNotifyOverInfo(self, playerID, overInfoData): self.__unNotifyOverInfoDict[playerID] = overInfoData return def GetPlayerUnNotifyOverInfo(self, playerID): return self.__unNotifyOverInfoDict.pop(playerID, None) # ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup def GetSaveData(self): savaData = "" cntData = "" cnt = 0 for overInfoData in self.__unNotifyOverInfoDict.values(): cnt += 1 savaData += overInfoData.getBuffer() GameWorld.Log("SaveDBCrossPKUnNotifyOverInfo cnt :%s len=%s" % (cnt, len(savaData))) return CommFunc.WriteDWORD(cntData, cnt) + savaData # ´ÓÊý¾Ý¿âÔØÈëÊý¾Ý def LoadPyGameData(self, datas, pos, dataslen): cnt, pos = CommFunc.ReadDWORD(datas, pos) GameWorld.Log("LoadDBCrossPKUnNotifyOverInfo cnt :%s" % cnt) for _ in xrange(cnt): overInfoData = PyGameDataStruct.tagDBCrossPKUnNotifyOverInfo() overInfoData.clear() pos += overInfoData.readData(datas, pos, dataslen) self.__unNotifyOverInfoDict[overInfoData.PlayerID] = overInfoData return pos def CrossServerMsg_PKOverInfo(playerOverDict): ## ×Ó·þ½ÓÊÕ¿ç·þPK½á¹ûÐÅÏ¢ curServerGroupID = GameWorld.GetServerGroupID() GameWorld.DebugLog("===ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄ¿ç·þPK½á¹û=== curServerGroupID=%s" % curServerGroupID) for playerID, overInfo in playerOverDict.items(): zoneID, seasonID, timeStr, winnerID, pkScore, danLV, cWinCount, addScore, tagPlayerID, tagPlayerName = overInfo if not PlayerControl.GetDBPlayerAccIDByID(playerID): GameWorld.DebugLog(" ²»ÊDZ¾·þÍæ¼Ò£¬²»´¦Àí! playerID=%s" % (playerID)) continue player = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if not player or PlayerControl.GetIsTJG(player): GameWorld.DebugLog(" Íæ¼Ò²»ÔÚÏß »òÍÑ»úÖУ¬ÏÈ»º´æ£¬Íæ¼ÒÉÏÏߺóÔÙͬ²½£¬playerID=%s" % (playerID)) overInfoData = PyGameDataStruct.tagDBCrossPKUnNotifyOverInfo() overInfoData.clear() overInfoData.ZoneID = zoneID overInfoData.SeasonID = seasonID overInfoData.RoomID = 0 overInfoData.TimeStr = timeStr overInfoData.OverType = 0 overInfoData.PlayerID = playerID overInfoData.WinnerID = winnerID overInfoData.RoundWinnerInfo = str([]) overInfoData.RoundWinnerLen = len(overInfoData.RoundWinnerInfo) overInfoData.PKScore = pkScore overInfoData.DanLV = danLV overInfoData.CWinCount = cWinCount overInfoData.AddScore = addScore overInfoData.TagPlayerID = tagPlayerID overInfoData.TagPlayerName = tagPlayerName PyDataManager.GetCrossPKUnNotifyOverInfoManager().AddUnNotifyOverInfo(playerID, overInfoData) continue sysMsg = str(overInfo) player.MapServer_QueryPlayerResult(0, 0, "CrossPKOverInfo", sysMsg, len(sysMsg)) GameWorld.DebugLog("֪ͨµØÍ¼¿ç·þPK½áËã: zoneID=%s,seasonID=%s,timeStr=%s,winnerID=%s, pkScore=%s,danLV=%s,cWinCount=%s,addScore=%s,tagPlayerID=%s,mapID=%s" % (zoneID, seasonID, timeStr, winnerID, pkScore, danLV, cWinCount, addScore, tagPlayerID, player.GetMapID()), playerID) return def __OnLoginNotifyPKOverInfo(curPlayer): playerID = curPlayer.GetPlayerID() overInfoData = PyDataManager.GetCrossPKUnNotifyOverInfoManager().GetPlayerUnNotifyOverInfo(playerID) if not overInfoData: return zoneID = overInfoData.ZoneID seasonID = overInfoData.SeasonID timeStr = overInfoData.TimeStr winnerID = overInfoData.WinnerID pkScore = overInfoData.PKScore danLV = overInfoData.DanLV cWinCount = overInfoData.CWinCount addScore = overInfoData.AddScore tagPlayerID = overInfoData.TagPlayerID tagPlayerName = overInfoData.TagPlayerName sysMsg = str([zoneID, seasonID, timeStr, winnerID, pkScore, danLV, cWinCount, addScore, tagPlayerID, tagPlayerName]) curPlayer.MapServer_QueryPlayerResult(0, 0, "CrossPKOverInfo", sysMsg, len(sysMsg)) GameWorld.DebugLog("Íæ¼ÒÉÏÏß֪ͨµØÍ¼Î´½áËãµÄ¿ç·þPK½áËã: zoneID=%s,seasonID=%s,timeStr=%s,winnerID=%s,pkScore=%s,danLV=%s,cWinCount=%s,addScore=%s,tagPlayerID=%s,mapID=%s" % (zoneID, seasonID, timeStr, winnerID, pkScore, danLV, cWinCount, addScore, tagPlayerID, curPlayer.GetMapID()), playerID) return def DR_CrossReamlPK(eventName, dataDict={}): drDataDict = {} drDataDict.update(dataDict) DataRecordPack.SendEventPack("CrossPK_%s" % eventName, drDataDict) return