#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # ##@package GameWorldMergeKing # # @todo:ÍõÕßÕù°Ô # @author hxp # @date 2015-11-13 # @version 1.0 # # ÏêϸÃèÊö: ÍõÕßÕù°Ô(¿ç·þPKÈüÖÜ»ý·ÖÅÅÃûǰ32¿É»ñµÃÕù°Ô×ʸñ) # #--------------------------------------------------------------------- #"""Version = 2015-11-19 14:00""" #--------------------------------------------------------------------- import ReadChConfig import PlayerControl import NetPackCommon import ChPyNetSendPack import PlayerCompensation import PlayerUniversalGameRec import PlayerMergeRegister import CrossRealmPlayer import GameWorldMergePK import PlayerDBGSEvent import MergeBroadcast import PlayerDBOper import ShareDefine import GameWorld import ChConfig import random g_playerEquipViewDict = {} # ²ÎÈüÍæ¼Ò×°±¸Ô¤ÀÀÐÅÏ¢ {mergeAccID:[[equipeId, equipPlace, startLV, elemLv], ...], ...} # ¿ç·þÍõÕßÕù°Ô¶ÔÕ½ÐÅÏ¢47 Def_MergeKingBattleRecordType = ShareDefine.Def_UniversalGameRecType_MergeKingBattleRecord # ¿ç·þÍõÕßÕù°ÔÉÏÒ»ÆÚ¶ÔÕ½ÐÅÏ¢48 Def_MergeKingBattleRecordLastType = ShareDefine.Def_UniversalGameRecType_MergeKingBattleRecordLast # ¿ç·þÍõÕßÕù°ÔÖ§³ÖѺעÐÅÏ¢49 Def_MergeKingSupportRecordType = ShareDefine.Def_UniversalGameRecType_MergeKingSupportRecord # ¿ç·þÍõÕßÕù°Ô¸ßÊÖÍæ¼Ò×°±¸Ô¤ÀÀÐÅÏ¢50 Def_MergeKingTopPlayerEquipRecordType = ShareDefine.Def_UniversalGameRecType_MergeKingTopPlayerEquip #ÍõÕßÕù°Ô»î¶¯×´Ì¬ÀàÐͶ¨Òå Def_Merge_King_32 = 32 #ÍõÕßÕù°Ô32Ç¿(Æ¥ÅäÈü»ý·Öǰ32Ãû) Def_Merge_King_16 = 16 #ÍõÕßÕù°Ô16Ç¿½ú¼¶Èü Def_Merge_King_8 = 8 #ÍõÕßÕù°Ô 8Ç¿½ú¼¶Èü Def_Merge_King_4 = 4 #ÍõÕßÕù°Ô 4Ç¿½ú¼¶Èü Def_Merge_King_2 = 2 #ÍõÕßÕù°Ô °ë¾öÈü Def_Merge_King_1 = 1 #ÍõÕßÕù°Ô ¾öÈü ( Def_SBCM_BattleGroupRecord, # ¹ã²¥¶ÔÕ½·Ö×éÐÅÏ¢ Def_SBCM_UpdBattleRecord, # ¸üжÔÕ½ÐÅÏ¢¼Ç¼ Def_SBCM_KingState, # ¶ÔÕ½½×¶Î״̬ Def_SBCM_TopPlayerEquipView, # ¸ßÊÖÍæ¼Ò×°±¸Ä£ÐÍÐÅÏ¢ ) = range(1, 1 + 4) ( Def_King_MaxWinCnt, # ×î´óʤ³¡Êý Def_King_ProcessTick, # ´¦ÀíÆµÂÊ Def_King_RoomOutTimeTick, # ·¿¼ä³¬Ê±Ê±¼ä Def_King_JoinMailContent, # ²ÎÈü×ʸñÓʼþÌáÐÑÄÚÈÝ Def_King_LoginNotify, # ÉÏÏßÌáÐÑ {¼¸Ç¿:mark,...} Def_King_LoginNotifyCD, # ÉÏÏßÌáÐÑCD, µ¥Î»Ãë ) = range(6) ( MergeKing_GSQType_Support, # Ѻע MergeKing_GSQType_Bribe, # »ß¸ MergeKing_GSQType_SupportAward, # ÁìÈ¡»ý·Ö½±Àø ) = range(3) ## Ѻע½á¹û ( SptResult_Unknown, # δ֪ SptResult_Correct, # ÕýÈ·µÄ SptResult_Inaccuracy, # ´íÎóµÄ SptResult_Bribe, # »ß¸ ) = range(4) # ¶ÔÕ½¼Ç¼ def GetRecGroupType(recData): return recData.GetValue1() def SetRecGroupType(recData, groupType): return recData.SetValue1(groupType) def GetRecBattleIndex(recData): return recData.GetValue2() def SetRecBattleIndex(recData, battleIndex): return recData.SetValue2(battleIndex) def GetRecJob(recData): return recData.GetValue3() def SetRecJob(recData, job): return recData.SetValue3(job) def GetRecFightPower(recData): return recData.GetValue4() def SetRecFightPower(recData, fightPower): return recData.SetValue4(fightPower) def GetRecIsBattleOver(recData): return recData.GetValue5() > 0 def SetRecBattleOver(recData): if recData.GetValue5() > 0: return # >0´ú±í±ÈÈüÒѽáÊø£¬Êµ¼Êʤ³¡ÊýΪvalue5-1 recData.SetValue5(1) return def GetRecWinCnt(recData): return max(0, recData.GetValue5() - 1) def SetRecWinCnt(recData, winCnt): return recData.SetValue5(winCnt) def GetRecAccID(recData): return recData.GetStrValue1() def SetRecAccID(recData, accID): return recData.SetStrValue1(accID) def GetRecPlayerName(recData): return recData.GetStrValue2() def SetRecPlayerName(recData, playerName): return recData.SetStrValue2(playerName) def GetRecMergeAccID(recData): return recData.GetStrValue3() def SetRecMergeAccID(recData, mergeAccID): return recData.SetStrValue3(mergeAccID) # Ѻע¼Ç¼ def GetSptRecGroupType(recData): return recData.GetValue1() def SetSptRecGroupType(recData, groupType): return recData.SetValue1(groupType) def GetSptRecBattleIndex(recData): return recData.GetValue2() def SetSptRecBattleIndex(recData, battleIndex): return recData.SetValue2(battleIndex) def GetSptRecMoneyType(recData): return recData.GetValue3() def SetSptRecMoneyType(recData, moneyType): return recData.SetValue3(moneyType) def GetSptRecScore(recData): return recData.GetValue4() def SetSptRecScore(recData, score): return recData.SetValue4(score) # 0-δ֪£»1-²Â¶Ô£»2-²Â´í£»3-»ß¸ def GetSptRecResult(recData): return recData.GetValue5() def SetSptRecResult(recData, result): return recData.SetValue5(result) def GetSptRecTagAccID(recData): return recData.GetStrValue1() # Ä¿±êÍæ¼ÒÕ˺Å(±»Ö§³ÖÕß) def SetSptRecTagAccID(recData, tagAccID): return recData.SetStrValue1(tagAccID) def GetSptRecAccID(recData): return recData.GetStrValue2() # ѺעµÄÍæ¼ÒÕ˺Šdef SetSptRecAccID(recData, accID): return recData.SetStrValue2(accID) ## Ö´ÐÐ32Ç¿·Ö×é def DoMergeKingBattleGrouping32(): GameWorld.Log("===ÍõÕßÕù°Ô·Ö×é===") # ÒÔÖܰñǰ32ÃûÀ´·Ö×é weekBillBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_MergePKWeek) findDBCnt = min(32, weekBillBoard.GetCount()) findMergePlayerIDList = [] for i in range(findDBCnt): bbData = weekBillBoard.At(i) if not bbData: continue findMergePlayerIDList.append(GameWorldMergePK.GetBBMergePlayerID(bbData)) if not findMergePlayerIDList: GameWorld.Log(" ÎÞÈ˲μÓÖÜÈü£¡") return # ²éѯÊý¾Ý¿âǰ32ÃûÍæ¼ÒÕ½Á¦ PlayerDBOper.FindDBOper(PlayerDBOper.Table_DBPlayer, {"PlayerID":{"$in":findMergePlayerIDList}}, {"PlayerID":1, "FightPower":1, "_id":0}, DGDBOperResult_MergeKingBattleGrouping) GameWorld.Log(" ²éѯÊý¾Ý¿â²ÎÈüÍæ¼ÒÕ½Á¦£¡ÈËÊý=%s,findAccIDList=%s" % (len(findMergePlayerIDList), str(findMergePlayerIDList))) return ## Êý¾Ý¿â²éѯսÁ¦½á¹û½øÐзÖ×é def DGDBOperResult_MergeKingBattleGrouping(resultSetList, extendValueList): GameWorld.Log("ÍõÕßÕù°ÔÊÕµ½²éѯÊý¾Ý¿âÕ½Á¦½á¹û, ¿ªÊ¼½øÐзÖ×é") GameWorld.Log(" Õ½Á¦ÐÅÏ¢: %s" % str(resultSetList)) fightPowerDict = {} for resultDict in resultSetList: fightPowerDict[resultDict["PlayerID"]] = resultDict["FightPower"] weekBillBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_MergePKWeek) maxBBCnt = weekBillBoard.GetCount() universalRecMgr = GameWorld.GetUniversalRecMgr() # ·Ö×éǰɾ³ýÉÏÖܶÔÕ½·Ö×é¼Ç¼ universalRecMgr.Delete(Def_MergeKingBattleRecordType) groupOrderList = GetGroupOrderList() GameWorld.Log(" ÅÅÃû·Ö×é˳Ðò: %s" % str(groupOrderList)) recordInfoList = [] recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordType) groupType = Def_Merge_King_16 for index, order in enumerate(groupOrderList): bbIndex = order - 1 if bbIndex < 0 or bbIndex >= maxBBCnt: continue bbData = weekBillBoard.At(bbIndex) if not bbData: continue battleIndex = index / 2 # ¶ÔÕ½×éË÷Òý£¬Á©Á©Ò»×é accID = "" if not bbData else GameWorldMergePK.GetBBPlayerAccID(bbData) job = 0 if not bbData else GameWorldMergePK.GetBBPlayerJob(bbData) playerName = "" if not bbData else GameWorldMergePK.GetBBPlayerName(bbData) mergePlayerID = 0 if not bbData else GameWorldMergePK.GetBBMergePlayerID(bbData) fightPower = fightPowerDict.get(mergePlayerID, 0) winCnt = 0 mergeAccID = str(mergePlayerID) recData = recordList.AddRec() __SetRecData(recData, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID) GameWorld.Log(" addRec i=%s,order=%s,groupType=%s,battleIndex=%s,job=%s,fightPower=%s,winCnt=%s,accID=%s,playerName=%s,mergeAccID=%s" % (index, order, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID)) recordInfoList.append([groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID]) GameWorld.Log(" ·Ö×éÍê±Ï, ½«·Ö×é½á¹ûͬ²½¸ø×Ó·þÎñÆ÷£¡") # ¹ã²¥×Ó·þ£¬¶ÔÕ½·Ö×éÐÅÏ¢ msgList = [Def_SBCM_BattleGroupRecord, recordInfoList] MergeBroadcast.SendBroadcastMerge(ChConfig.Def_MergePKKing, 0, msgList, False) __LogRecBattleRecordTData() return def GetGroupOrderList(): # ´ÓµÚ9ÃûÒÔºó˳Ðò´òÂÒ groupOrderList = range(9, 33) random.shuffle(groupOrderList) # °´¹Ì¶¨Ë³Ðò²åÈëǰ8ÃûÍæ¼Ò fixedIndexOrderList = [(0, 1), (4, 8), (8, 3), (12, 6), (16, 2), (20, 7), (24, 4), (28, 5)] for index, order in fixedIndexOrderList: groupOrderList.insert(index, order) return groupOrderList ## ÍõÕßÕù°Ô¶Ôս״̬±ä¸ü def OnMergeKingStateChange(state): if not GameWorld.IsMergeServer(): return GameWorld.Log("ÍõÕßÕù°Ô״̬±ä¸ü: state=%s" % state) tick = GameWorld.GetGameWorld().GetTick() if state == Def_Merge_King_16: GameWorld.GetVSRoomManager().DeleteAllVsRooms() GameWorld.Log(" 16Ç¿½ú¼¶Èü¿ªÊ¼£¬Çå¿ÕËùÓжÔÕ½·¿¼ä£¡") # ·Ç¸Õ¿ªÊ¼µÄʱºòÐèÒªÇ¿ÖÆ½áÊøÎ´½áÊøµÄ¶ÔÕ½·¿¼ä if state != Def_Merge_King_16: __ForceOverVsRoom() if state > 0: __DoLogic_StartMergeKingBattle(state, tick) # ¹ã²¥×Ó·þ£¬¶ÔÕ½ÐÅÏ¢ msgList = [Def_SBCM_KingState, state] MergeBroadcast.SendBroadcastMerge(ChConfig.Def_MergePKKing, 0, msgList, False) return ## Íæ¼Ò¿ç·þÍõÕßÕù°Ô¶¨Ê±´¦ÀíÂß¼­ def OnMergeKingProcess(tick): # ·Ç¿ç·þ·þÎñÆ÷²»´¦Àí¿ç·þPKÆ¥ÅäÂß¼­ if not GameWorld.IsMergeServer(): return if not GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_Merge_King): return kingCfg = ReadChConfig.GetEvalChConfig("MergeKing") processTick = kingCfg[Def_King_ProcessTick] processTickKey = "MergeKingLastTick" lastProcessTick = GameWorld.GetGameWorld().GetDictByKey(processTickKey) if tick - lastProcessTick < processTick: return GameWorld.GetGameWorld().SetDict(processTickKey, tick) __ProcessOutTimeVsRoom(kingCfg[Def_King_RoomOutTimeTick], tick) return # Õ½¶··¿¼ä³¬Ê±£¬ÐèÒªÖ÷¶¯½áÊøÁ½¸öÍæ¼Ò¶¼Ã»Óпç·þ¾ö¶·µÄ·¿¼ä(»î¶¯Ê±¼äÄÚ£¬¶ÔÊÖÁ½È˾ùΪÉÏÏß) def __ProcessOutTimeVsRoom(outTimeTick, tick): overVsRoomList = [] vsRoomMgr = GameWorld.GetVSRoomManager() for vsRoomIndex in range(vsRoomMgr.GetVsRoomCount()): vsRoom = vsRoomMgr.GetVsRoom(vsRoomIndex) if not vsRoom: continue if tick - vsRoom.GetOpenTick() < outTimeTick: continue # ÒѾ­ÓÐÍæ¼Ò½øÈëµÄ²»´¦Àí³¬Ê±£¬ÐèµÈ´ýÍæ¼Ò´òÍê if vsRoom.GetRoomState(): continue overVsRoomList.append(vsRoom) if overVsRoomList: GameWorld.Log("Ç¿ÖÆ½áÊøÕ½¶·³¬Ê±·¿¼ä(%s)" % len(overVsRoomList)) __DoOverVsRoom(overVsRoomList) return ## Ç¿ÖÆ½áÊøÒì³£µÄ¶ÔÕ½·¿¼ä ## Ò»°ãÊǶÔÕ½µØÍ¼Òì³£µ¼ÖÂδͬ²½Õ½¶·½á¹ûÉÏÀ´£¬´ËʱÐèÒªÇ¿ÖÆ½áÊøÕâЩ·¿¼ä£¬ÒÔ±£Ö¤ÏÂÒ»ÂֵıÈÈü˳Àû½øÐÐ def __ForceOverVsRoom(): overVsRoomList = [] vsRoomMgr = GameWorld.GetVSRoomManager() for vsRoomIndex in range(vsRoomMgr.GetVsRoomCount()): vsRoom = vsRoomMgr.GetVsRoom(vsRoomIndex) if not vsRoom: continue overVsRoomList.append(vsRoom) if overVsRoomList: GameWorld.Log("Ç¿ÖÆ½áÊøÕ½¶·Òì³£·¿¼ä(%s)" % len(overVsRoomList)) __DoOverVsRoom(overVsRoomList) return ## ÊÕµ½MapServer¸±±¾ÍõÕßÕù°ÔÕ½¶·½á¹ûͬ²½ def MapServer_MergeKingFB(infoList): GameWorld.Log("ÊÕµ½MapServer_¿ç·þÍõÕßÕù°Ô¸±±¾ÐÅÏ¢ %s" % str(infoList)) fbState = infoList[0] roomID = infoList[1] vsRoom = GameWorld.GetVSRoomManager().FindVsRoom(roomID) if not vsRoom: GameWorld.ErrLog("ÕÒ²»µ½ÍõÕßÕù°Ô¶ÔÕ½·¿¼ä: roomID=%s" % roomID) return # ÒѾ­ÓÐÈ˽øÈëPK¸±±¾ if fbState == 1: playerID, playerName = infoList[2:] vsRoom.SetRoomState(1) # ÉèÖÃΪ1£¬±íʾÓÐÍæ¼Ò½øÀ´ºóÐèµÈMapServer½áÊøºó²Å¿Éɾ³ý·¿¼ä GameWorld.Log(" Íæ¼Ò½øÈ븱±¾, SetRoomState=1,roomID=%s,playerID=%s,playerName=%s" % (roomID, playerID, playerName)) if fbState == 2: winnerWincnt, loserWincnt, winnerMergeAccID, winnerEquipViewList, loserEquipViewList = infoList[2:] __DoOverVsRoom([[vsRoom, winnerWincnt, loserWincnt, winnerMergeAccID, winnerEquipViewList, loserEquipViewList]]) return ## Ö´ÐнáÊøÕ½¶··¿¼äÂß¼­ def __DoOverVsRoom(overVsRoomList): global g_playerEquipViewDict isAllOver = False updRecDict = {} maxWinCnt = ReadChConfig.GetEvalChConfig("MergeKing")[Def_King_MaxWinCnt] recordList = GameWorld.GetUniversalRecMgr().GetTypeList(Def_MergeKingBattleRecordType) for overRoomInfo in overVsRoomList: if isinstance(overRoomInfo, list): vsRoom, winnerWincnt, loserWincnt, winnerMergeAccID, winnerEquipViewList, loserEquipViewList = overRoomInfo else: vsRoom, winnerWincnt, loserWincnt, winnerMergeAccID, winnerEquipViewList, loserEquipViewList = overRoomInfo, maxWinCnt, 0, "", [], [] roomID = vsRoom.GetCreaterID() GameWorld.GetVSRoomManager().DeleteVsRoomById(roomID) if winnerWincnt < maxWinCnt: winnerWincnt = maxWinCnt # »ñʤ·½»ñʤ´ÎÊý±ØÐëÂú×ã¹æÔò»ñʤ³¡´Î, È·±£ºóÐøÏà¹ØÅжÏÕý³£ GameWorld.Log(" ¾ÀÕý»ñʤ·½»ñʤ³¡Êý: winnerWincnt=%s,maxWinCnt=%s" % (winnerWincnt, maxWinCnt)) GameWorld.Log(" ½áÊøÕ½¶··¿¼ä: vaRoomID=%s,winnerWincnt=%s,loserWincnt=%s,winnerMergeAccID=%s" % (roomID, winnerWincnt, loserWincnt, winnerMergeAccID)) GameWorld.Log(" winnerEquipViewList=%s" % (winnerEquipViewList)) GameWorld.Log(" loserEquipViewList=%s" % (loserEquipViewList)) groupType, battleIndex = __GetMergeKingGroupByRoomID(roomID) recDataList = GetBattleRecData(groupType, battleIndex) if not recDataList or len(recDataList) != 2: GameWorld.ErrLog(" ½áÊøÕ½¶··¿¼äÒì³££¡") continue aRecData = recDataList[0] bRecData = recDataList[1] if not aRecData or not bRecData: GameWorld.ErrLog(" ½áÊøÕ½¶··¿¼äÒì³££¡£¡") continue if not winnerMergeAccID: sortList = [[GetRecFightPower(aRecData), aRecData], [GetRecFightPower(bRecData), bRecData]] sortList.sort(reverse=True) winnerRecData = sortList[0][1] loserRecData = sortList[1][1] else: winnerRecData = aRecData if GetRecMergeAccID(aRecData) == winnerMergeAccID else bRecData loserRecData = aRecData if GetRecMergeAccID(aRecData) != winnerMergeAccID else bRecData if winnerEquipViewList: g_playerEquipViewDict[GetRecMergeAccID(winnerRecData)] = winnerEquipViewList if loserEquipViewList: g_playerEquipViewDict[GetRecMergeAccID(loserRecData)] = loserEquipViewList allOver = __UpdBattleOver(recordList, updRecDict, winnerRecData, winnerWincnt, loserRecData, loserWincnt) isAllOver = True if allOver else isAllOver if updRecDict: GameWorld.Log(" ¹ã²¥×Ó·þ¶ÔÕ½¼Ç¼±ä¸üÐÅÏ¢£¡") msgList = [Def_SBCM_UpdBattleRecord, isAllOver, updRecDict] MergeBroadcast.SendBroadcastMerge(ChConfig.Def_MergePKKing, 0, msgList, False) __LogRecBattleRecordTData() if isAllOver: # ¸üиßÊÖ°ñÄ£ÐÍÐÅÏ¢ __SaveTopPlayerEquipView() return ## Ö´ÐпªÊ¼ÐÂÒ»ÂÖÍõÕßÕù°Ô½ú¼¶ÈüÂß¼­ def __DoLogic_StartMergeKingBattle(battleGroupType, tick): GameWorld.Log("===Ö´ÐпªÊ¼ÐÂÒ»ÂÖÍõÕßÕù°Ô½ú¼¶ÈüÂß¼­: battleGroupType=%s===" % battleGroupType) updRecDict = {} # ´¦ÀíÂÖ¿ÕÍæ¼Ò groupPlayerDict = {} creatVsRoomList = [] universalRecMgr = GameWorld.GetUniversalRecMgr() recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordType) for i in range(recordList.Count()): recData = recordList.At(i) groupType = GetRecGroupType(recData) if groupType != battleGroupType: continue battleIndex = GetRecBattleIndex(recData) key = "%s_%s" % (groupType, battleIndex) playerList = groupPlayerDict.get(key, []) playerList.append(recData) groupPlayerDict[key] = playerList # ÓÐÁ½¸öÈ˲ſª·¿¼ä, Ò»¸öÈ˵ÄÖ±½Ó½ú¼¶£¬²»ÐèÒª¿ª·¿ vsRoomID = __GetMergeKingBattleRoomID(groupType, battleIndex) if vsRoomID not in creatVsRoomList and len(playerList) == 2: creatVsRoomList.append(vsRoomID) maxWinCnt = ReadChConfig.GetEvalChConfig("MergeKing")[Def_King_MaxWinCnt] GameWorld.Log("=ÏÈ´¦Àí±¾ÂÖÂÖ¿ÕÍæ¼Ò, Ö±½Ó½ú¼¶£¡") isAllOver = False for playerList in groupPlayerDict.values(): # Ö»ÓÐÒ»¸öÈË´ú±í±¾ÂÖÂÖ¿Õ£¬Ö±½Ó½ú¼¶ if len(playerList) != 1: continue allOver = __UpdBattleOver(recordList, updRecDict, playerList[0], maxWinCnt) isAllOver = True if allOver else isAllOver if updRecDict: GameWorld.Log(" ¹ã²¥×Ó·þÂÖ¿ÕÍæ¼Ò¶ÔÕ½¼Ç¼±ä¸üÐÅÏ¢£¡") msgList = [Def_SBCM_UpdBattleRecord, isAllOver, updRecDict] MergeBroadcast.SendBroadcastMerge(ChConfig.Def_MergePKKing, 0, msgList, False) __LogRecBattleRecordTData() # ´´½¨¶ÔÕ½·¿¼ä GameWorld.Log(" ´´½¨±¾ÂÖ¶ÔÕ½·¿¼ä! battleGroupType=%s,count=%s, creatVsRoomList=%s" % (battleGroupType, len(creatVsRoomList), str(creatVsRoomList))) vsRoomMgr = GameWorld.GetVSRoomManager() for vsRoomID in creatVsRoomList: newRoom = vsRoomMgr.AddVsRoom(vsRoomID) if not newRoom: continue newRoom.SetOpenTick(tick) newRoom.SetRoomState(0) GameWorld.Log(" µ±Ç°×ܶÔÕ½·¿¼äÊý: %s" % vsRoomMgr.GetVsRoomCount()) if isAllOver: # ¸üиßÊÖ°ñÄ£ÐÍÐÅÏ¢ __SaveTopPlayerEquipView() return ## ¸üжÔÕ½½áÊø¼Ç¼ ## ÍõÕßÕù°ÔÕ½ÊÇ·ñ±ÈÈüÍê½á def __UpdBattleOver(recordList, updRecDict, winnerRecData, winnerWincnt, loserRecData=None, loserWincnt=0): if not winnerRecData: return False __UpdRecDataOver(winnerRecData, winnerWincnt, updRecDict) if loserRecData: __UpdRecDataOver(loserRecData, loserWincnt, updRecDict) groupType = GetRecGroupType(winnerRecData) battleIndex = GetRecBattleIndex(winnerRecData) winnerName = GetRecPlayerName(winnerRecData) loserName = "" if not loserRecData else GetRecPlayerName(loserRecData) nextGroupType = groupType / 2 if nextGroupType <= 0: # »ñµÃ¹Ú¾üÈ«·þ¹ã²¥ GameWorld.Log(" ×îºóÒ»ÂÖ»ñʤ£¬»ñµÃ¹Ú¾ü£¡accID=%s" % GetRecAccID(winnerRecData)) PlayerControl.MergeWorldNotify(0, "Campaign_liubo_213370", [winnerName, groupType, loserName]) # ¿½±´×îÐÂÒ»ÆÚ½á¹û¼Ç¼ #PlayerUniversalGameRec.CopyRecData(Def_MergeKingBattleRecordLastType, Def_MergeKingBattleRecordType) return True # ½ú¼¶È«·þ¹ã²¥ if loserName: PlayerControl.MergeWorldNotify(0, "Campaign_liubo_466020", [winnerName, groupType, loserName]) else: PlayerControl.MergeWorldNotify(0, "Campaign_liubo_825676", [winnerName, groupType]) nextBattleIndex = battleIndex / 2 job = GetRecJob(winnerRecData) fightPower = GetRecFightPower(winnerRecData) accID = GetRecAccID(winnerRecData) playerName = GetRecPlayerName(winnerRecData) mergeAccID = GetRecMergeAccID(winnerRecData) newRecData = recordList.AddRec() __SetRecData(newRecData, nextGroupType, nextBattleIndex, job, fightPower, 0, accID, playerName, mergeAccID) key = "%s_%s_%s" % (nextGroupType, nextBattleIndex, accID) updRecDict[key] = [nextGroupType, nextBattleIndex, job, fightPower, 0, accID, playerName, mergeAccID] GameWorld.Log(" ÐÂÔö½ú¼¶¼Ç¼; nextGroupType=%s,nextBattleIndex=%s,job=%s,fightPower=%s,winCnt=%s,accID=%s,playerName=%s,mergeAccID=%s" % (nextGroupType, nextBattleIndex, job, fightPower, 0, accID, playerName, mergeAccID)) return False ## ¸üжÔÕ½Íæ¼Ò½áÊø¼Ç¼ def __UpdRecDataOver(recData, winCnt, updRecDict): if GetRecIsBattleOver(recData): return winCntValue = winCnt + 1 # ½áÊøÕ½¶·µÄĬÈÏ+1£¬±íʾ½áÊø£¬Êµ¼Êʤ³¡Îª¸ÃÖµ-1 SetRecWinCnt(recData, winCntValue) groupType = GetRecGroupType(recData) battleIndex = GetRecBattleIndex(recData) job = GetRecJob(recData) fightPower = GetRecFightPower(recData) accID = GetRecAccID(recData) playerName = GetRecPlayerName(recData) mergeAccID = GetRecMergeAccID(recData) SetRecBattleOver(recData) # ÉèÖøÃÌõÕ½¶·ÐÅÏ¢Íê½á key = "%s_%s_%s" % (groupType, battleIndex, accID) updRecDict[key] = [groupType, battleIndex, job, fightPower, winCntValue, accID, playerName, mergeAccID] GameWorld.Log(" ¸üÐÂÍæ¼ÒÕ½¶·¼Ç¼; groupType=%s,battleIndex=%s,job=%s,fightPower=%s,winCnt=%s,accID=%s,playerName=%s,mergeAccID=%s" % (groupType, battleIndex, job, fightPower, winCntValue, accID, playerName, mergeAccID)) return ## »î¶¯½áÊøºó±£´æ¸ßÊÖÍæ¼Ò×°±¸Ô¤ÀÀÐÅÏ¢ def __SaveTopPlayerEquipView(): global g_playerEquipViewDict GameWorld.Log("¿ªÊ¼±£´æÍõÕßÕù°Ô¸ßÊÖÍæ¼ÒÄ£ÐÍÔ¤ÀÀÐÅÏ¢...") #for mergeAccID, equipInfo in g_playerEquipViewDict.items(): # GameWorld.DebugLog(" mergeAccID=%s,equipInfo=%s" % (mergeAccID, str(equipInfo))) maxWinCnt = ReadChConfig.GetEvalChConfig("MergeKing")[Def_King_MaxWinCnt] recordList = GameWorld.GetUniversalRecMgr().GetTypeList(Def_MergeKingBattleRecordType) # ¸ù¾Ý¶ÔÕ½¼Ç¼±£´æÃ¿¸öÍæ¼ÒµÄ×î¸ßÅÅÃû mergeAccIDRankDict = {} for i in range(recordList.Count()): recData = recordList.At(i) groupType = GetRecGroupType(recData) winCnt = GetRecWinCnt(recData) isWin = winCnt >= maxWinCnt mergeAccID = GetRecMergeAccID(recData) curRank = mergeAccIDRankDict.get(mergeAccID, [100, None])[0] if isWin and groupType < curRank: mergeAccIDRankDict[mergeAccID] = [groupType, recData] #GameWorld.Log(" Íæ¼Ò¶ÔÓ¦ÅÅλÐÅÏ¢: %s" % str(mergeAccIDRankDict)) syncClientServerInfo = {} for mergeAccID, recInfo in mergeAccIDRankDict.items(): groupType, recData = recInfo # ·Ç4ǿ֮ǰµÄ²»Í¬²½ if groupType > 4: continue job = GetRecJob(recData) order = GetRecGroupType(recData) accID = GetRecAccID(recData) playerName = GetRecPlayerName(recData) equipViewInfoList = g_playerEquipViewDict.get(mergeAccID, []) syncClientServerInfo[accID] = [playerName, equipViewInfoList, job, order] GameWorld.Log(" ¸ßÊÖ×°±¸ÐÅÏ¢: accID=%s,job=%s,order=%s,playerName=%s,equipViewInfoList=%s" % (accID, job, order, playerName, str(equipViewInfoList))) # ¹ã²¥×Ó·þ¸ßÊÖÄ£ÐÍÐÅÏ¢ GameWorld.Log(" ¹ã²¥×Ó·þÍõÕßÕù°Ô¸ßÊÖ°ñÍæ¼ÒÄ£ÐÍÔ¤ÀÀÐÅÏ¢!") msgList = [Def_SBCM_TopPlayerEquipView, syncClientServerInfo] MergeBroadcast.SendBroadcastMerge(ChConfig.Def_MergePKKing, 0, msgList, False) return ################################################################################ def __SetMergeKingActionKeyValue(gameWorld, key, value, isSaveDB): gameWorld.SetDict(key, value) if isSaveDB: PlayerDBGSEvent.SetDBGSTrig_ByKey(key, value) GameWorld.SendMapServerMsgEx(key, value) GameWorld.Log(" ¿ç·þÍõÕßÕù°Ô״̬ID±ä¸ü key=%s,value=%s" % (key, value)) return def OnMapServerInitOK(): gameWorld = GameWorld.GetGameWorld() # PK״̬ kingStateKey = ShareDefine.Def_Notify_WorldKey_Merge_King GameWorld.SendMapServerMsgEx(kingStateKey, gameWorld.GetDictByKey(kingStateKey)) for idKey in [ShareDefine.Def_Notify_WorldKey_Merge_KingStartID, ShareDefine.Def_Notify_WorldKey_Merge_KingOverID, ShareDefine.Def_Notify_WorldKey_Merge_KingServerHonour, ]: actionID = gameWorld.GetDictByKey(idKey) # Èç¹ûûÓÐÖµ£¬ÔòÈ¡DB¼Ç¼ÖеÄÖµ if actionID <= 0: actionID = PlayerDBGSEvent.GetDBGSTrig_ByKey(idKey) gameWorld.SetDict(idKey, actionID) GameWorld.SendMapServerMsgEx(idKey, actionID) return ## Íæ¼ÒµÇ½ def OnPlayerLogin(curPlayer, tick): playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("ÍõÕßÕù°ÔOnPlayerLogin", playerID) if GameWorld.IsMergeServer(): GameWorld.DebugLog(" ¿ç·þ·þÎñÆ÷²»´¦Àí") return PlayerUniversalGameRec.SendUniversalGameRecInfo(curPlayer, Def_MergeKingBattleRecordType) PlayerUniversalGameRec.SendUniversalGameRecInfo(curPlayer, Def_MergeKingSupportRecordType) gameWorld = GameWorld.GetGameWorld() mergeKingState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_Merge_King) GameWorld.DebugLog(" mergeKingState=%s" % mergeKingState) if mergeKingState: PlayerControl.SetVsRoomId(curPlayer, 0) __ClientServer_PrepareEnterMergeKing(mergeKingState, curPlayer) kingCfg = ReadChConfig.GetEvalChConfig("MergeKing") # ÍõÕßÉÏÏßÌáÐÑ rankDict = __GetMergeKingRecRecordRankDict() accID = curPlayer.GetAccID() playerRecRank = rankDict.get(accID, 0) loginNotifyDict = kingCfg[Def_King_LoginNotify] notifyCD = kingCfg[Def_King_LoginNotifyCD] if playerRecRank in loginNotifyDict: notifyTimeKey = "MergeKingNotifyTime_%s" % curPlayer.GetPlayerID() # ²ÎÊýplayerID lastNotifyTime = gameWorld.GetDictByKey(notifyTimeKey) if tick - lastNotifyTime >= notifyCD * 1000: mark = loginNotifyDict[playerRecRank] mergeName = CrossRealmPlayer.GetCrossPlayerName(curPlayer) PlayerControl.MergeWorldNotify(0, mark, [mergeName]) gameWorld.SetDict(notifyTimeKey, tick) else: GameWorld.Log("%sÇ¿Íæ¼ÒÉÏÏßÈ«·þÌáÐÑCDÖÐ..." % playerRecRank, curPlayer.GetPlayerID()) # ÅÅλÏàͬ£¬ÎÞÐè¸üРif playerRecRank != PlayerControl.GetMergeWarRank(curPlayer): playerRecRank = "%s" % playerRecRank curPlayer.MapServer_QueryPlayerResult(0, 0, 'MergeWarRank', playerRecRank, len(playerRecRank)) GameWorld.Log("ÉÏÏ߸üÐÂÍæ¼Ò¿ç·þÍõÕßÕù°ÔÅÅλ: %s" % playerRecRank, playerID) return def __GetMergeKingBattleRoomID(groupType, battleIndex): return groupType * 100 + battleIndex + 1 def __GetMergeKingGroupByRoomID(roomID): return roomID / 100, roomID % 100 - 1 ## ÊÕµ½¿ç·þ·þÎñÆ÷ÍõÕßÕù°Ô¹ã²¥µÄÐÅÏ¢ def OnRecvMergeServerPKKing(broadcastMsg): if len(broadcastMsg) < 1: return msgType = broadcastMsg[0] msgList = broadcastMsg[1:] gameWorld = GameWorld.GetGameWorld() GameWorld.Log("OnRecvMergeServerPKKing msgType=%s" % msgType) if msgType == Def_SBCM_BattleGroupRecord: __ClientServer_SaveBattleGroupRecord(msgList[0]) elif msgType == Def_SBCM_UpdBattleRecord: __ClientServer_UpdBattleRecord(msgList[0], msgList[1]) elif msgType == Def_SBCM_KingState: state = msgList[0] __SetMergeKingActionKeyValue(gameWorld, ShareDefine.Def_Notify_WorldKey_Merge_King, state, False) __ClientServer_PrepareEnterMergeKing(state) elif msgType == Def_SBCM_TopPlayerEquipView: __ClientServer_SaveTopPlayerEquipView(msgList[0]) return ## ×Ó·þÖ´ÐнøÈë¿ç·þÍõÕßÕù°ÔÉÏ´«Êý¾Ý×¼±¸Âß¼­ ## Íæ¼ÒµÇ¼ʱÐèÖ´Ðиüì²é£¬ÈôÓÐÍæ¼ÒÕýÔÚ½øÐÐÖеıÈÈü£¬ÔòÈÃÍæ¼Ò×¼±¸½øÈë def __ClientServer_PrepareEnterMergeKing(curBattleGroupType, curPlayer=None): if curBattleGroupType <= 0: return playerID = 0 if not curPlayer else curPlayer.GetPlayerID() GameWorld.Log("===×Ó·þ¼ì²éÍæ¼Ò½øÈë¿ç·þÍõÕßÕù°ÔÉÏ´«Êý¾Ý===groupType=%s" % curBattleGroupType, playerID) actionType = ShareDefine.Def_MergeAction_MergeKing mapID = ChConfig.Def_MergeTransMapID # ĬÈÏÏÈÉÏ´«µ½ÖÐתµØÍ¼ posX, posY = ChConfig.Def_MergeTransMapPos # ֪ͨ¶ÔÓ¦×éÕ½¶·Íæ¼Ò½øÈë¿ç·þÍõÕßÕù°Ô universalRecMgr = GameWorld.GetUniversalRecMgr() recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordType) for i in range(recordList.Count()): recData = recordList.At(i) groupType = GetRecGroupType(recData) battleIndex = GetRecBattleIndex(recData) accID = GetRecAccID(recData) if curPlayer and accID != curPlayer.GetAccID(): continue # Ö±½ÓÂÖ¿Õ½ú¼¶ if groupType == curBattleGroupType / 2 and not curPlayer: notifyPlayer = curPlayer if curPlayer else GameWorld.GetPlayerManager().FindPlayerByAccID(accID) # ÌáÊ¾Íæ¼Ò if notifyPlayer: PlayerControl.NotifyCode(notifyPlayer, "Campaign_liubo_329496", [curBattleGroupType]) notifyPlayerID = 0 if not notifyPlayer else notifyPlayer.GetPlayerID() GameWorld.Log(" Íæ¼ÒÂÖ¿ÕÖ±½Ó½ú¼¶: accID=%s" % accID, notifyPlayerID) continue # ·Ç±¾ÂÖ¶ÔÕ½×é²»×ö×¼±¸ if groupType != curBattleGroupType: continue if GetRecIsBattleOver(recData): GameWorld.DebugLog(" ¸Ã³¡Õ½¶·ÒѾ­½áÊø: groupType=%s,battleIndex=%s,accID=%s,value5=%s" % (groupType, battleIndex, accID, recData.GetValue5())) continue player = GameWorld.GetPlayerManager().FindPlayerByAccID(accID) if not player: GameWorld.DebugLog(" Íæ¼Ò²»ÔÚÏß»ò²»ÊDZ¾·þÍæ¼Ò!accID=%s" % (accID)) continue roomID = __GetMergeKingBattleRoomID(groupType, battleIndex) PlayerControl.SetVsRoomId(player, roomID, True) # ֪ͨµØÍ¼Íæ¼ÒÉÏ´«Êý¾Ý, ×¼±¸½øÈë¿ç·þ·þÎñÆ÷ÍõÕßÕù°Ô PlayerMergeRegister.SendMergeActionReg(player, actionType, [mapID, mapID, 0, posX, posY]) return ## ÉÏ´«Êý¾Ý³É¹¦ºó£¬Í¨ÖªÍæ¼Ò½øÈë¿ç·þÍõÕßÕù°Ô def Notify_PlayerEnterMergeKing(curPlayer): groupType = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_Merge_King) if groupType <= 0: return # Í¨ÖªÍæ¼Ò¿É½øÈë¿ç·þPK enterPack = ChPyNetSendPack.tagCanEnterMergeKing() enterPack.Clear() enterPack.GroupType = groupType NetPackCommon.SendFakePack(curPlayer, enterPack) GameWorld.Log(" Í¨ÖªÍæ¼Ò½øÈë¿ç·þÍõÕßÕù°Ô¶ÔÕ½·¿¼ä!groupType=%s,vsRoomID=%s" % (groupType, curPlayer.GetVsRoomId()), curPlayer.GetPlayerID()) return ## ×Ó·þ±£´æÍõÕßÕù°Ô¶ÔÕ½·Ö×éÐÅÏ¢ def __ClientServer_SaveBattleGroupRecord(msgList): GameWorld.Log("===×Ó·þ±£´æÍõÕßÕù°Ô¶ÔÕ½·Ö×éÐÅÏ¢===") universalRecMgr = GameWorld.GetUniversalRecMgr() # ÏÈɾ³ýÔÙ¸²¸Ç±£´æ universalRecMgr.Delete(Def_MergeKingBattleRecordType) # ɾ³ý¶ÔÕ½ÐÅÏ¢ universalRecMgr.Delete(Def_MergeKingSupportRecordType) # ɾ³ýѺעÐÅÏ¢ recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordType) mailPlayerIDList = [] for i, dataList in enumerate(msgList): groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID = dataList recData = recordList.AddRec() __SetRecData(recData, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID) GameWorld.Log(" saveRec i=%s,groupType=%s,battleIndex=%s,job=%s,fightPower=%s,winCnt=%s,accID=%s,playerName=%s,mergeAccID=%s" % (i, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID)) playerID = PlayerMergeRegister.GetRegisterPlayerID(mergeAccID) # ±¾·þÍæ¼ÒÓʼþÌáÐѲμӻʱ¼ä if playerID > 0 and playerID not in mailPlayerIDList: mailPlayerIDList.append(playerID) if mailPlayerIDList: content = ReadChConfig.GetEvalChConfig("MergeKing")[Def_King_JoinMailContent] PlayerCompensation.SendPersonalItemMailEx("", content, 1, mailPlayerIDList, []) GameWorld.Log("×Ó·þ±£´æÍõÕßÕù°Ô¶ÔÕ½·Ö×éÐÅÏ¢ OK!") __LogRecBattleRecordTData() # ¹ã²¥ÔÚÏßÍæ¼Ò PlayerUniversalGameRec.SendUniversalGameRecInfo(None, Def_MergeKingBattleRecordType) PlayerUniversalGameRec.SendUniversalGameRecInfo(None, Def_MergeKingSupportRecordType) PlayerControl.WorldNotify(0, "Campaign_liubo_521297") # ÉèÖÿªÊ¼ID±ä¸ü gameWorld = GameWorld.GetGameWorld() startID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_MergePKWeekID) __SetMergeKingActionKeyValue(gameWorld, ShareDefine.Def_Notify_WorldKey_Merge_KingStartID, startID, True) return ## ×Ó·þ¸üÐÂÍõÕßÕù°Ô¶ÔÕ½ÐÅÏ¢ def __ClientServer_UpdBattleRecord(isAllOver, msgDict): GameWorld.Log("===×Ó·þ¸üÐÂÍõÕßÕù°Ô¶ÔÕ½ÐÅÏ¢===isAllOver=%s" % isAllOver) maxWinCnt = ReadChConfig.GetEvalChConfig("MergeKing")[Def_King_MaxWinCnt] winBattleKeyList = [] loseBattleKeyList = [] universalRecMgr = GameWorld.GetUniversalRecMgr() recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordType) for i in range(recordList.Count()): if not msgDict: break recData = recordList.At(i) key = "%s_%s_%s" % (GetRecGroupType(recData), GetRecBattleIndex(recData), GetRecAccID(recData)) if key not in msgDict: continue groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID = msgDict.pop(key) __SetRecData(recData, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID) GameWorld.Log(" updRec key=%s,groupType=%s,battleIndex=%s,job=%s,fightPower=%s,winCnt=%s,accID=%s,playerName=%s,mergeAccID=%s" % (key, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID)) # »ñʤµÄÍæ¼Ò if winCnt >= maxWinCnt: winBattleKeyList.append(key) else: loseBattleKeyList.append(key) GameWorld.Log(" ×Ó·þ¸üÐÂÌí¼ÓÍõÕßÕù°Ô¶ÔÕ½ÐÅÏ¢(%s)" % len(msgDict)) for key, dataInfo in msgDict.items(): groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID = dataInfo recData = recordList.AddRec() __SetRecData(recData, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID) GameWorld.Log(" addRec key=%s,groupType=%s,battleIndex=%s,job=%s,fightPower=%s,winCnt=%s,accID=%s,playerName=%s,mergeAccID=%s" % (key, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID)) GameWorld.Log("×Ó·þ¸üÐÂÍõÕßÕù°Ô¶ÔÕ½ÐÅÏ¢ OK!") __LogRecBattleRecordTData() # ¹ã²¥ÔÚÏßÍæ¼Ò PlayerUniversalGameRec.SendUniversalGameRecInfo(None, Def_MergeKingBattleRecordType) # ¸üÐÂѺע½á¹û __UpdSupportResult(winBattleKeyList, loseBattleKeyList) if isAllOver: __ClientServer_DoLogicOnAllOver() return ## ¸üÐÂѺע¼Ç¼½á¹û def __UpdSupportResult(winBattleKeyList, loseBattleKeyList): if not winBattleKeyList and not loseBattleKeyList: return GameWorld.Log("×Ó·þ¸üÐÂÍõÕßÕù°ÔѺע½á¹û...") GameWorld.Log(" winBattleKeyList =%s" % str(winBattleKeyList)) GameWorld.Log(" loseBattleKeyList=%s" % str(loseBattleKeyList)) universalRecMgr = GameWorld.GetUniversalRecMgr() recordList = universalRecMgr.GetTypeList(Def_MergeKingSupportRecordType) for i in range(recordList.Count()): recData = recordList.At(i) # ·Çδ֪µÄ²»´¦Àí if GetSptRecResult(recData) != SptResult_Unknown: continue key = "%s_%s_%s" % (GetSptRecGroupType(recData), GetSptRecBattleIndex(recData), GetSptRecTagAccID(recData)) if key in winBattleKeyList: SetSptRecResult(recData, SptResult_Correct) elif key in loseBattleKeyList: SetSptRecResult(recData, SptResult_Inaccuracy) else: continue accID = GetSptRecAccID(recData) # ѺעµÄÍæ¼ÒÕ˺Šplayer = GameWorld.GetPlayerManager().FindPlayerByAccID(accID) if player: PlayerUniversalGameRec.SendUniversalGameRecSingle(player, recData) return ## ×Ó·þËùÓбÈÈüÍê½áºó´¦Àí def __ClientServer_DoLogicOnAllOver(): GameWorld.Log("×Ó·þËùÓбÈÈüÍê½áºó´¦Àí...") # ×Ó·þ¿½±´×îÐÂÒ»ÆÚ½á¹û¼Ç¼ PlayerUniversalGameRec.CopyRecData(Def_MergeKingBattleRecordLastType, Def_MergeKingBattleRecordType) GameWorld.Log(" ×Ó·þ¿½±´×îÐÂÒ»ÆÚ½á¹û¼Ç¼...") # ¸üÐÂÍæ¼Ò¿ç·þÕ½×îÐÂÅÅλ rankDict = __GetMergeKingRecRecordRankDict() playerManager = GameWorld.GetPlayerManager() # Íæ¼Ò¿ç·þÅÅλÓиıäµÄ£¬Í¨ÖªmapË¢ÐÂÊôÐÔ for i in range(playerManager.GetPlayerCount()): player = playerManager.GetPlayerByIndex(i) if player == None or not player.GetInitOK(): continue accID = player.GetAccID() playerRecRank = rankDict.get(accID, 0) lastRank = PlayerControl.GetMergeWarRank(player) # ÅÅλδ¸Ä±ä£¬ÎÞÐè´¦Àí if playerRecRank == lastRank: continue playerRecRank = "%s" % playerRecRank player.MapServer_QueryPlayerResult(0, 0, 'MergeWarRank', playerRecRank, len(playerRecRank)) GameWorld.Log(" ¸üÐÂÍæ¼ÒÅÅλ:accID=%s,lastRank=%s, playerRecRank=%s" % (accID, lastRank, playerRecRank)) # ¸üзþÎñÆ÷ÈÙÒ«ÅÅλ __UpdMergeKingServerHonourRank() # ÉèÖýáÊøID±ä¸ü gameWorld = GameWorld.GetGameWorld() overID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_MergePKWeekID) __SetMergeKingActionKeyValue(gameWorld, ShareDefine.Def_Notify_WorldKey_Merge_KingOverID, overID, True) GameWorld.Log(" ¸üÐÂÍõÕßÕù°Ô»î¶¯½áÊøID=%s" % overID) return ## ÉèÖÃrecÊý¾Ý def __SetRecData(recData, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID): SetRecGroupType(recData, groupType) SetRecBattleIndex(recData, battleIndex) SetRecJob(recData, job) SetRecFightPower(recData, fightPower) SetRecWinCnt(recData, winCnt) SetRecAccID(recData, accID) SetRecPlayerName(recData, playerName) SetRecMergeAccID(recData, mergeAccID) return def __UpdMergeKingServerHonourRank(): serverHonour = 100 rankOrderList = [Def_Merge_King_32, Def_Merge_King_16, Def_Merge_King_8, Def_Merge_King_4, Def_Merge_King_2, Def_Merge_King_1] maxWinCnt = ReadChConfig.GetEvalChConfig("MergeKing")[Def_King_MaxWinCnt] universalRecMgr = GameWorld.GetUniversalRecMgr() recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordLastType) for i in range(recordList.Count()): recData = recordList.At(i) if not recData: continue groupType = GetRecGroupType(recData) if groupType not in rankOrderList: continue mergeAccID = GetRecMergeAccID(recData) playerID = PlayerMergeRegister.GetRegisterPlayerID(mergeAccID) # ²»ÊDZ¾·þÍæ¼Ò if playerID <= 0: GameWorld.DebugLog("²»ÊDZ¾·þÍæ¼Ò mergeAccID=%s" % mergeAccID) continue winCnt = GetRecWinCnt(recData) isWin = winCnt >= maxWinCnt # ½ú¼¶¸üе±Ç°ÅÅÃû if isWin and groupType < serverHonour: serverHonour = groupType serverHonour = 0 if serverHonour == 100 else serverHonour gameWorld = GameWorld.GetGameWorld() __SetMergeKingActionKeyValue(gameWorld, ShareDefine.Def_Notify_WorldKey_Merge_KingServerHonour, serverHonour, True) GameWorld.Log(" ¸üÐÂÈ«·þÈÙÒ«ÅÅλֵ=%s" % serverHonour) return def __GetMergeKingRecRecordRankDict(): rankDict = {} rankOrderList = [Def_Merge_King_32, Def_Merge_King_16, Def_Merge_King_8, Def_Merge_King_4, Def_Merge_King_2, Def_Merge_King_1] maxWinCnt = ReadChConfig.GetEvalChConfig("MergeKing")[Def_King_MaxWinCnt] universalRecMgr = GameWorld.GetUniversalRecMgr() recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordLastType) for i in range(recordList.Count()): recData = recordList.At(i) if not recData: continue groupType = GetRecGroupType(recData) if groupType not in rankOrderList: continue accID = GetRecAccID(recData) if accID not in rankDict: rankDict[accID] = Def_Merge_King_32 # ĬÈÏÖÁÉÙ32Ç¿ curRank = rankDict[accID] winCnt = GetRecWinCnt(recData) isWin = winCnt >= maxWinCnt # ½ú¼¶¸üе±Ç°ÅÅÃû if isWin and groupType < curRank: rankDict[accID] = groupType GameWorld.DebugLog("__GetMergeKingRecRecordRankDict %s" % rankDict) return rankDict def __LogRecBattleRecordTData(): if not GameWorld.GetGameWorld().GetDebugLevel(): return GameWorld.Log("===__LogRecBattleRecordTData===") universalRecMgr = GameWorld.GetUniversalRecMgr() recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordType) for i in range(recordList.Count()): recData = recordList.At(i) GameWorld.Log("i=%s,groupType=%s,battleIndex=%s,job=%s,fightPower=%s,winCnt=%s,value5=%s,accID=%s,playerName=%s,mergeAccID=%s" % (i, GetRecGroupType(recData), GetRecBattleIndex(recData), GetRecJob(recData), GetRecFightPower(recData), GetRecWinCnt(recData), recData.GetValue5(), GetRecAccID(recData), GetRecPlayerName(recData), GetRecMergeAccID(recData))) GameWorld.Log("===__LogRecBattleRecordTData===End") return def __ClientServer_SaveTopPlayerEquipView(viewInfoDict): universalRecMgr = GameWorld.GetUniversalRecMgr() # Çå¿Õ¼Ç¼, ÖØÐ¸ù¾Ý±¾ÆÚ½áËãµÄÅÅÐаñÌí¼Ó¼Ç¼ universalRecMgr.Delete(Def_MergeKingTopPlayerEquipRecordType) GameWorld.Log("×Ó·þ¸üпç·þÍõÕßÕù°Ô¸ßÊÖ°ñÔ¤ÀÀÐÅÏ¢¡£¡£¡£") recordList = universalRecMgr.GetTypeList(Def_MergeKingTopPlayerEquipRecordType) for accID, viewInfo in viewInfoDict.items(): playerName, equipViewInfoList, job, order = viewInfo for equipViewInfo in equipViewInfoList: recData = recordList.AddRec() equipViewInfo = str(equipViewInfo) recData.SetValue2(job) recData.SetValue3(order) recData.SetStrValue1(accID) recData.SetStrValue2(playerName) recData.SetStrValue3(equipViewInfo) GameWorld.Log(" ±£´æ¼Í¼ job=%s,order=%s,accID=%s,name=%s,equipViewInfo=%s" % (job, order, accID, playerName, equipViewInfo)) # ͬ²½ÔÚÏßÍæ¼Ò playerManager = GameWorld.GetPlayerManager() for index in range(0, playerManager.GetPlayerCount()): player = playerManager.GetPlayerByIndex(index) if player == None or not player.GetInitOK(): continue PlayerUniversalGameRec.SendUniversalGameRecInfo(player, Def_MergeKingTopPlayerEquipRecordType) GameWorld.Log(" ×Ó·þ¸üпç·þÍõÕßÕù°Ô¸ßÊÖ°ñÔ¤ÀÀÐÅÏ¢OK!") return ################################################################################ def GetBattleRecData(groupType, battleIndex, accID=""): recDataList = [] universalRecMgr = GameWorld.GetUniversalRecMgr() recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordType) for i in range(recordList.Count()): recData = recordList.At(i) if GetRecGroupType(recData) != groupType or GetRecBattleIndex(recData) != battleIndex \ or (accID and GetRecAccID(recData) != accID): continue if accID != "": return recData recDataList.append(recData) return recDataList def GetSupportRecData(groupType, battleIndex, accID): universalRecMgr = GameWorld.GetUniversalRecMgr() recordList = universalRecMgr.GetTypeList(Def_MergeKingSupportRecordType) for i in range(recordList.Count()): recData = recordList.At(i) if GetSptRecGroupType(recData) != groupType or GetSptRecBattleIndex(recData) != battleIndex \ or GetSptRecAccID(recData) != accID: continue return recData return def MapServer_MergeKingQuery(curPlayer, queryInfo): queryType = queryInfo[0] queryParamList = queryInfo[1:] if queryType == MergeKing_GSQType_Support: return __DoLogic_GSQType_Support(curPlayer, queryType, queryParamList) elif queryType == MergeKing_GSQType_Bribe: return __DoLogic_GSQType_Bribe(curPlayer, queryType, queryParamList) elif queryType == MergeKing_GSQType_SupportAward: return __DoLogic_GSQType_SupportAward(curPlayer, queryType, queryParamList) return "" def __DoLogic_GSQType_Support(curPlayer, queryType, queryParamList): playerID = curPlayer.GetPlayerID() groupType, battleIndex, moneyType, costMoney, tagAccID, score, unSupportScore = queryParamList GameWorld.Log("ÍõÕßÕù°ÔѺע: groupType=%s,battleIndex=%s,moneyType=%s,costMoney=%s,tagAccID=%s,score=%s,unSupportScore=%s" % (groupType, battleIndex, moneyType, costMoney, tagAccID, score, unSupportScore), playerID) recDataList = GetBattleRecData(groupType, battleIndex) if not recDataList: GameWorld.Log(" ÕÒ²»µ½ÍõÕßÕù°Ô¶ÔÕ½Íæ¼Ò×éÐÅÏ¢£¬GroupType=%s, BattleIndex=%s" % (groupType, battleIndex), playerID) return "" isOver = False findTagAccID = False for recData in recDataList: if GetRecAccID(recData) == tagAccID: findTagAccID = tagAccID # ×é¶ÔÕ½ÒѽáÊø£¬²»ÄÜÔÙѺע£¬Ö»ÄÜͨ¹ý»ß¸»ñµÃѺע»ý·Ö if GetRecIsBattleOver(recData): isOver = True if not findTagAccID: GameWorld.Log(" ÕÒ²»µ½ÍõÕßÕù°Ô¶ÔÕ½Íæ¼ÒÐÅÏ¢£¬GroupType=%s, BattleIndex=%s, tagAccID=%s" % (groupType, battleIndex, tagAccID), playerID) return "" if isOver: GameWorld.Log(" ¸Ã×éÍõÕßÕù°Ô¶ÔÕ½ÒѾ­½áÊø£¬²»¿ÉѺע£¡£¬GroupType=%s, BattleIndex=%s" % (groupType, battleIndex), playerID) return "" accID = curPlayer.GetAccID() sptRecData = GetSupportRecData(groupType, battleIndex, accID) if sptRecData: GameWorld.Log(" ÒѾ­Ñº×¢¹ý¸Ã×éÍæ¼Ò£¬GroupType=%s, BattleIndex=%s, TagAccID=%s" % (groupType, battleIndex, GetSptRecTagAccID(sptRecData)), playerID) return "" # ¿ÉÒÔѺע£¬½øÐÐѺע´¦Àí __UpdSupportRecData(curPlayer, None, groupType, battleIndex, moneyType, tagAccID, score, SptResult_Unknown) return [queryType, moneyType, costMoney] def __DoLogic_GSQType_Bribe(curPlayer, queryType, queryParamList): playerID = curPlayer.GetPlayerID() groupType, battleIndex, moneyType, costMoney, tagAccID, score, unSupportScore = queryParamList GameWorld.Log("ÍõÕßÕù°Ô»ß¸: groupType=%s,battleIndex=%s,moneyType=%s,costMoney=%s,tagAccID=%s,score=%s,unSupportScore=%s" % (groupType, battleIndex, moneyType, costMoney, tagAccID, score, unSupportScore), playerID) recDataList = GetBattleRecData(groupType, battleIndex) if not recDataList: GameWorld.Log(" ÕÒ²»µ½ÍõÕßÕù°Ô¶ÔÕ½Íæ¼Ò×éÐÅÏ¢£¬GroupType=%s, BattleIndex=%s" % (groupType, battleIndex), playerID) return "" winnerAccID = "" winnerWinCnt = 0 for recData in recDataList: winCnt = GetRecWinCnt(recData) recAccID = GetRecAccID(recData) if GetRecIsBattleOver(recData): if winCnt > winnerWinCnt: winnerWinCnt = winCnt winnerAccID = recAccID if not winnerAccID: GameWorld.Log(" ÕÒ²»µ½ÍõÕßÕù°Ô¶ÔÕ½»ñÊ¤Íæ¼ÒÐÅÏ¢£¬GroupType=%s, BattleIndex=%s, winnerAccID=%s" % (groupType, battleIndex, winnerAccID), playerID) return "" bribeScore = score accID = curPlayer.GetAccID() sptRecData = GetSupportRecData(groupType, battleIndex, accID) if not sptRecData: GameWorld.Log(" δѺע¹ý¸Ã×飬»ß¸»ý·Ö¼õÉÙ! GroupType=%s, BattleIndex=%s, unSupportScore=%s" % (groupType, battleIndex, unSupportScore), playerID) bribeScore = unSupportScore # ÒѾ­Ñº×¢¹ý£¬ÅжÏÊÇ·ñÕýÈ·£¬ÕýÈ·Ôò²»ÐèÒª»ß¸ else: sptRecTagAccID = GetSptRecTagAccID(sptRecData) if sptRecTagAccID == winnerAccID: GameWorld.Log(" ÒѾ­Ñº×¢ÕýÈ·£¬²»ÐèÒª»ß¸£¡GroupType=%s,BattleIndex=%s,winnerAccID=%s,sptRecTagAccID=%s" % (groupType, battleIndex, winnerAccID, sptRecTagAccID), playerID) return "" __UpdSupportRecData(curPlayer, sptRecData, groupType, battleIndex, moneyType, winnerAccID, bribeScore, SptResult_Bribe) return [queryType, moneyType, costMoney] def __UpdSupportRecData(curPlayer, sptRecData, groupType, battleIndex, moneyType, tagAccID, score, result): accID = curPlayer.GetAccID() if not sptRecData: universalRecMgr = GameWorld.GetUniversalRecMgr() recordList = universalRecMgr.GetTypeList(Def_MergeKingSupportRecordType) sptRecData = recordList.AddRec() GameWorld.DebugLog(" Ôö¼ÓѺע¼Ç¼£¡") SetSptRecGroupType(sptRecData, groupType) SetSptRecBattleIndex(sptRecData, battleIndex) SetSptRecMoneyType(sptRecData, moneyType) SetSptRecResult(sptRecData, result) SetSptRecTagAccID(sptRecData, tagAccID) SetSptRecAccID(sptRecData, accID) SetSptRecScore(sptRecData, score) PlayerUniversalGameRec.SendUniversalGameRecSingle(curPlayer, sptRecData) GameWorld.DebugLog(" ±£´æÑº×¢¼Ç¼£¡groupType=%s,battleIndex=%s,moneyType=%s,tagAccID=%s,score=%s,result=%s" % (groupType, battleIndex, moneyType, tagAccID, score, result)) return def __DoLogic_GSQType_SupportAward(curPlayer, queryType, queryParamList): index = queryParamList[0] totalScore = 0 accID = curPlayer.GetAccID() universalRecMgr = GameWorld.GetUniversalRecMgr() recordList = universalRecMgr.GetTypeList(Def_MergeKingSupportRecordType) for i in range(recordList.Count()): recData = recordList.At(i) if GetSptRecAccID(recData) != accID: continue # ·ÇÕýÈ·µÄ²»¼Ó»ý·Ö if GetSptRecResult(recData) not in [SptResult_Correct, SptResult_Bribe]: continue totalScore += GetSptRecScore(recData) return [queryType, index, totalScore]