#!/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]
|
|