#!/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 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 = PlayerControl.GetMergePlayerName(accID, curPlayer.GetName()) 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]